??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品国产国产精品四凭 ,国产精品久久久久久久午夜片,国产V亚洲V天堂无码久久久http://www.shnenglu.com/xieshuo/You will never walk alone!zh-cnThu, 08 May 2025 15:40:08 GMTThu, 08 May 2025 15:40:08 GMT60法DMW记.http://www.shnenglu.com/xieshuo/archive/2014/07/08/207577.html Torres TorresTue, 08 Jul 2014 12:11:00 GMThttp://www.shnenglu.com/xieshuo/archive/2014/07/08/207577.htmlhttp://www.shnenglu.com/xieshuo/comments/207577.htmlhttp://www.shnenglu.com/xieshuo/archive/2014/07/08/207577.html#Feedback0http://www.shnenglu.com/xieshuo/comments/commentRss/207577.htmlhttp://www.shnenglu.com/xieshuo/services/trackbacks/207577.htmlPushing yourself when no one else is around.

Torres 2014-07-08 20:11 发表评论
]]>
Linux memory summaryhttp://www.shnenglu.com/xieshuo/archive/2013/12/09/204679.html Torres TorresMon, 09 Dec 2013 09:42:00 GMThttp://www.shnenglu.com/xieshuo/archive/2013/12/09/204679.htmlhttp://www.shnenglu.com/xieshuo/comments/204679.htmlhttp://www.shnenglu.com/xieshuo/archive/2013/12/09/204679.html#Feedback0http://www.shnenglu.com/xieshuo/comments/commentRss/204679.htmlhttp://www.shnenglu.com/xieshuo/services/trackbacks/204679.htmlFrom Unix某论坛,忘记名字?..但这D|字从宏观上讲清楚了Linux Memory的构架?br />1. 内核初始化:

    *
内核建立好内栔R目录表数据库,假设物理内存大小?/span>lenQ则建立?/span>[3G--3G+len]::[0--len]q样的虚地址vaddr和物理地址paddr的线性对应关p;
    *
内核建立一?/span>page数组Q?/span>page数组和物理页面系列完全是U性对应,page用来理该物理页面状态,每个物理面的虚地址保存?/span>page->virtual中;
    *
内核建立好一?/span>free_listQ将没有使用的物理页面对应的page攑օ其中Q已l用的׃用放入了Q?/span>

2.
内核模块甌内存vaddr = get_free_pages(mask,order)Q?/span>

    *
内存理模块?/span>free_list扑ֈ一?/span>pageQ将page->virtual作ؓq回|该返回值就是对应物理页面的虚地址Q?/span>
    *
?/span>page?/span>free_list中脱;
    *
模块使用该虚拟地址操作对应的物理内存;

3.
内核模块使用vaddrQ例如执行指?/span>mov(eax, vaddr)Q?/span>

    * CPU
获得vaddrq个虚地址Q利用徏立好的页目录表数据库,扑ֈ其对应的物理内存地址Q?/span>
    *
?/span>eax的内容写?/span>vaddr对应的物理内存地址内;

4.
内核模块释放内存free_pages(vaddr,order)Q?/span>

    *
依据vaddr扑ֈ对应?/span>pageQ?/span>
    *
page加入?/span>free_list中;

5.
用户q程甌内存vaddr = malloc(size)Q?/span>

    *
内存理模块从用戯E内存空?/span>(0--3G)中找C块还没用的I间vm_area_struct(start--end)Q?/span>
    *
随后其插入?/span>task->mm->mmap链表中;

6.
用户q程写入vaddr(0-3G)Q例如执行指?/span>mov(eax, vaddr)Q?/span>

    * CPU
获得vaddrq个虚地址Q该虚地址应该已经?/span>glibc库设|好了,一定在3G一下的某个区域Q根?/span>CR3寄存器指向的current->pgd查当前进E的늛录页表数据库Q发现该vaddr对应的页目录表项?/span>0Q故产生异常Q?/span>
    *
在异常处理中Q发现该vaddr对应?/span>vm_area_struct已经存在Qؓvaddr对应的页目录表项分配一个页表;
    *
随后?/span>free_list扑ֈ一?/span>pageQ将?/span>page对应的物理页面物理首地址赋给vaddr对应的页表表,很明显,此时?/span>vaddr?/span>paddr不是U性对应关pMQ?/span>
    *
?/span>page?/span>free_list中脱;
    *
异常处理q回Q?/span>
    * CPU
重新执行刚刚发生异常的指?/span>mov(eax, vaddr)Q?/span>
    * CPU
获得vaddrq个虚地址Q根?/span>CR3寄存器指向的current->pgdQ利用徏立好的页目录表数据库,扑ֈ其对应的物理内存地址Q?/span>
    *
?/span>eax的内容写?/span>vaddr对应的物理内存地址内;  

7.
用户q程释放内存vaddrQ?/span>free(vaddr)Q?/span>

    *
扑ֈ?/span>vaddr所在的vm_area_structQ?/span>
    *
扑ֈvm_area_struct:start--end对应的所有页目录表,清空对应的所有页表项Q?/span>
    *
释放q些表Ҏ向物理页面所对应?/span>pageQƈ这?/span>page加入?/span>free_list队列中;
    *
有必要还会清IZ些页目录表项Qƈ释放q些늛录表Ҏ向的表Q?/span>
    *
?/span>task->mm->mmap链中删除?/span>vm_area_structq放掉Q?/span>

l合说明Q?/span>

    *
可用物理内存是free_list中各page对应的物理内存;
    *
늛录页表数据库的主要目的是?/span>CPU讉K物理内存时{?/span>vaddr-->paddr使用Q分配以及释攑ֆ存时不会用到Q但是需要内核内存管理系l在合适时ZؓCPU建立好该库;
    *
对于用户q程?/span>6中获得的物理面Q有两个表对应,一个就是内栔R目录表数据库的某个pte[i ]Q一个就是当前进E内栔R目录表数据库的某个 pte[j]Q但是只有一?/span>page和其对应。如果此时调度到其他q程Q其他进E申请ƈ讉K某个内存Q则不会涉及到该物理面Q因为其分配旉先要?/span> free_list中找一?/span>pageQ而该物理面对应?/span>page已经?/span>free_list中脱d来了Q因此不存在该物理页面被其他q程改写操作的情c内怸通过get_free_pages{方式获取内存时Q也不会涉及到该物理面Q原理同前所q?/span>

Torres 2013-12-09 17:42 发表评论
]]>
高性能JNIhttp://www.shnenglu.com/xieshuo/archive/2013/12/09/204678.html Torres TorresMon, 09 Dec 2013 09:40:00 GMThttp://www.shnenglu.com/xieshuo/archive/2013/12/09/204678.htmlhttp://www.shnenglu.com/xieshuo/comments/204678.htmlhttp://www.shnenglu.com/xieshuo/archive/2013/12/09/204678.html#Feedback0http://www.shnenglu.com/xieshuo/comments/commentRss/204678.htmlhttp://www.shnenglu.com/xieshuo/services/trackbacks/204678.htmlfrom: http://www.cnblogs.com/whjiang/articles/1387364.html

1. 可能不要创建global reference和global weak reference. 创徏q两cd用的JNI接口NewGlobalReference和NewGlobalWeakReference内部实现

有一个锁。这个锁使得在多处理器上的可扩展性非常差Q因为各个线E都在等待这个锁。所以尽量不要在native保存java 对象的引用,情愿在每?/span>
JNI call旉带点参数。当Ӟ在native保持java对象的local reference是非常危险的Q绝对不能那样干?/span>

2. 量不要使用GetPrimitiveArrayCritical/ReleasePrimitiveArrayCritical来pin住Java内存。JVM本n没有提供M只pin住一块Java内存而不?/span>
响GC的操作,所以这个操作是会阻止GCq行的。作偿,ReleasePrimitiveArrayCritical会生一ơ隐式的GC调用。这样就可能出现在需要GC的时
候无法GCQ而在不需要GC时进行无意义GC的情c另外,q两个操作的实现中在某些情况下也可能触发锁。解x法:如果是小块内存的话,情愿?/span>
用Get<Type>ArrayRegion和Set<Type>ArrayRegion来在native和Java之间复制内存?/span>

3. 在Java appliation中尽量不要创建phantom reference或者soft reference。这些reference会极大的影响GC?/span>
我们先来谈谈JVM的GC。GC分ؓminor GC和full GC。Java内存分ؓyoung和old两代。在young memory中,每个U程都有自己的内存分配块Q不和其?/span>
U程׃nQ,而old memory是由所有线E共享的。minor GC只对young memory作GCQ而full GCҎ有内存都做GC。minor GC是可以多U程q行q行?/span>
Q而full GC默认只能单线E执行。所以,一ơfull GC需要的旉可以是minor GC?0倍以上(可以?verbose:gc观察Q。所以在一般应用中Q?/span>
minor GC的次数应该是full GC?0倍左x比较理想的。minor GC会将无法攉的对象移动到old memory中去?/span>

minor GC不会对phantom reference和soft referenceq行攉Q只有full GC才会。这L问题是大量的这cd象积聚v来,产生许多的内存复制?/p>

q样每次minor GC可能基本上没有释放多少内存Q得full GC׃被频J触发。可能出现minor GC和full GCơ数1Q?的情况,甚至全是full GC?/p>

q样Q无论是性能q是可扩展性都是非常差的?br />

weak reference的媄响好像小一些,但也应该量避免?/span>

 

在JNI开发中Q用这3Ureference的主要目的是保证native资源的释放。因为java对象的finalizeҎ是不保证被调用的Q所以必ȝq些

reference来帮助实现native资源释放。ؓ了避免上q的问题Q一U可行的Ҏ是将native资源serialize成一块内存,然后攑ֈjava对象中保存,?/span>
而避免用这些reference?/span>

4. NIO是不错的Java和native之间share memory的方法。但要注意它的性能。首先一定要讄对big endianq是little endianQ防止JVM做额外的
endian转换动作。其ơ是在启动JVM时一定要加上-server选项Q否则nio性能会非常差。在-server mode下,nio性能大概比java数组?0%~50%.?
client mode下,性能?倍以上?/span>

5. 量不要在JNI去new Java String对象。这个比在java层new慢很多?/span>

6. 对java大对象(比方说数l)Q一定要仔细的tune他的大小。一般来_对象对GC比较友好。因为对象分配时先看每个U程自己的young memory
Q如果找的到_大的内存的话Q就分配。否则在old memory中分配。因为old memory是sharedQ所以可能有锁开销。而且old memory中的对象只有
full GC才能释放它。所以对象比较小是比较好的。JVM的内存分配算法是为小对象优化q的Q大量小对象的分配是很高效的Q所以不用怕把大对象拆?/span>
在某些情况下Q如果知道对象会zȝ很久的话Q就让它大一点,增加它直接分配在old memory中的概率。这样可以节Uyoung GC拯q个对象到old 

memory中的开销?/p>



Torres 2013-12-09 17:40 发表评论
]]>
W二?~译和链?/title><link>http://www.shnenglu.com/xieshuo/archive/2013/10/21/203851.html</link><dc:creator> Torres</dc:creator><author> Torres</author><pubDate>Mon, 21 Oct 2013 09:01:00 GMT</pubDate><guid>http://www.shnenglu.com/xieshuo/archive/2013/10/21/203851.html</guid><wfw:comment>http://www.shnenglu.com/xieshuo/comments/203851.html</wfw:comment><comments>http://www.shnenglu.com/xieshuo/archive/2013/10/21/203851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/xieshuo/comments/commentRss/203851.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/xieshuo/services/trackbacks/203851.html</trackback:ping><description><![CDATA[<div>W二?/div><div>~译和链?/div><div>q章比较W统Q都是概念,熟悉基本程的hQ徏议不看?/div><div> </div><div>记录一些基本流E?/div><div> </div><div>拿GCC来说</div><div>用GCC~译链接生成可执行文件的q程分ؓ下面4个步?/div><div>PrepressingQCompilationQAssemblyQLinking</div><div> </div><div>Prepressing 预处?/div><div>?c -> .i (gcc -E)</div><div>主要是处理,前缀?#8216;#’的语?/div><div> </div><div>define的直接替?/div><div>对defineq种Q从我观察应该是q样</div><div>Ҏ文gcM.c直接扫描 看到define的符L接加到表?/div><div>然后在替换的时候会做递归查,直到W号是最l定义?/div><div> </div><div>所以这个与define的顺序没有太大关pMQ只要不循环嵌套</div><div> </div><div>cMq种</div><div>#define M (N + 1)</div><div>#define N 2</div><div> </div><div>q种在用到M的时候,会先替换?QN + 1Q但是发现替换的表达式中q有未决symbolQ那?/div><div>再q行替换 Q? + 1Q?/div><div> </div><div>表中q不会直接写?M Q? + 1Q,臛_我看到的GCC行ؓ是这栗?/div><div> </div><div>include的也是直接导?/div><div> </div><div>另外预编译选项 #ifdef 之类的会处理掉,删掉所有注?/div><div> </div><div>#pragma是要被保留给~译器的Q这是编译器选项Q例?pragma pack是用来指定字节对齐标准的</div><div> </div><div>Compilation ~译</div><div>?.i -> .s (gcc -S)</div><div>现在的GCC版本都把预编译和~译做到了一个可执行E序?-> ccl</div><div> </div><div>~译的主要过E?/div><div>扫描Q语法分析,语义分析Q源代码优化Q代码生成,目标代码优化</div><div>Source code --Scanner--> Tokens --Parser--> Syntax Tree</div><div>--Semantic Analyzer--> Commented Syntax Tree --Source code Optimizer--> Intermediate Representation</div><div>--Code Generator--> Target Code --Code Optimizer-->Final Target Code<br /><div> </div><div>Assembly 汇编</div><div>?.s -> .o (gcc -c) -->汇编器as</div><div> </div><div>Linking 链接</div><div>ld做的事情</div><div>link的时候由于每个源文g都是单独~译Q那么必d理一些外来的symbol</div><div>包括函数和全局变量</div></div><div></div><img src ="http://www.shnenglu.com/xieshuo/aggbug/203851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/xieshuo/" target="_blank"> Torres</a> 2013-10-21 17:01 <a href="http://www.shnenglu.com/xieshuo/archive/2013/10/21/203851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>W一?温故而知?/title><link>http://www.shnenglu.com/xieshuo/archive/2013/10/18/203804.html</link><dc:creator> Torres</dc:creator><author> Torres</author><pubDate>Fri, 18 Oct 2013 11:42:00 GMT</pubDate><guid>http://www.shnenglu.com/xieshuo/archive/2013/10/18/203804.html</guid><wfw:comment>http://www.shnenglu.com/xieshuo/comments/203804.html</wfw:comment><comments>http://www.shnenglu.com/xieshuo/archive/2013/10/18/203804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/xieshuo/comments/commentRss/203804.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/xieshuo/services/trackbacks/203804.html</trackback:ping><description><![CDATA[<div>W一?/div> <div>印象:</div> <div>gPCI/ISA的架?/div> <div>North Bridge相当于h的心脏,q接所有高速设备,CPU ->大脑</div> <div>南桥芯片则负责低速设备连?br />  </div> <div></div> <div>SMP<br /> </div> <div></div> <div>中间?是解军_多问题的大方?/div> <div>Any problem in computer science can be resolved by another layer of indirection<br /> <br />CPU密集?IO密集?/div> <div>q两U类型的ProcessQ理Z优先U高的,也就是说最应该先得到CPU的是IO密集?/div> <div></div> <div>通俗的理解应该是IO密集型做完事情花的CPU旉最,然后׃{待IO讑֤的反应,q样可以让设备性能最大化<br /> </div> <div></div> <div>Memory</div> <div>分段分页 MMU<br /> </div> <div></div> <p>U程安全和线E模?br /> </p> <div>其中U程安全有两件事情要注意</div> <div>Semaphore</div> <div>Mutex</div> <div>上面q两个可以做成全局的,q不一定是By Process的,例如POSIX pthread?/div> <div>对Mutex做attr讑֮的时候就可以指定?shared process</div> <div>也就是说一个Process可以加锁Q另外一个可以释放他?/div> <div>另外q种Mutex必须处在׃n内存中,否则没办法访问。有亲缘关系的Process可以通过mmap一个匿名映做?/div> <div>anyway有很多方式了?br /> </div> <div></div> <div>Critical Section</div> <div>q个是Inter Process的东ѝ?br /> </div> <div></div> <div>关于U程互斥的lock的问?/div> <div>RW lock是Ҏ通lock记录两个状态来供read or write操作选择<br /> <br />属于U程本n的东?TLS/Stack/Register<br /> </div> <div>有时候编译器会ؓ了做优化</div> <div>内存和寄存器的数据会出现不sync的状态?/div> <div></div> <div>即你用lock来做保护,也不一定能OK。然后volatile出C?nbsp;<br /> </div> <div>volatile最主要的作用就是thread内保证编译器不要做优化,防止q种不sync带来的问题?/div> <div></div> <div>一般是q样例如x变量Qthread_1dx变量攑ֈ了寄存器中,因ؓ可能马上会再讉K它,那么对xq行操作后就不会写回内存</div> <div>q样即你加了lockQ这个时候lock也被释放掉了Q操作完成)Q但是结果未能SyncQ那么thread 2来访问x的时候,在内?/div> <div>中拿到的值就变成dirty状态了?br />  </div> <div></div> <div>另外一U过度优化就是CPU做的优化Q有些上下语义无关的指oQCPU有可能会调整q行序?/div> <div>书中有个l典样例</div> <div>一D?Singleton pattern的double-check的代?/div> <div></div> <div>volatile T* pInst = NULL;</div> <div>T* getInstance()</div> <div>{</div> <div><span style="white-space:pre"> </span>if (pInst == NULL)</div> <div><span style="white-space:pre"> </span>{</div> <div><span style="white-space:pre"> </span>lock();</div> <div><span style="white-space:pre"> </span>if (pInst == NULL)</div> <div><span style="white-space:pre"> </span>pInst = new T();</div> <div><span style="white-space:pre"> </span>unlock();</div> <div><span style="white-space:pre"> </span>}</div> <div><span style="white-space:pre"> </span>return pInst;</div> <div>}<br /><br /> </div> <div></div> <div>q里有两?/div> <div>W一Qdouble-check 也就是双if能避免过多的无用的get lockQ降低消?/div> <div>对界区需要做保护的资源,可以提前d状态,如果W合自己的预期,而且短时间不会有变化Q那么就不用L锁了</div> <div>不知道ؓ啥我惛_了unlikelyQ但仔细想一下,功能完全不同?br /> </div> <div></div> <div>W二点也是要说的CPU的过度优?/div> <div>q里已经是声明volatile了,所以没有寄存器和内存不sync的问?/div> <div>但是׃q里new需要先 malloc出空_然后call T的constructor?/div> <div>所以有可能会发生这U情况,malloc出空间后Q把地址付给pInstQ然后去做初始化Q?/div> <div>q样有可能另外一个线E取得的object是没有被完全初始化好的,是否会出问题depend on T的具体实C?/div> <div></div> <div>许多CPU提供了barrier指o用来解决上面提到的问题?br /> </div> <div></div> <div></div> <div>U程模型</div> <div>q个东西Q我看了下,开始没看明白,q边书这个东西没讲清楚,后来ȝ上找了些资料。用LE和内核U程的对应关pd决于调度单位?/div> <div>也就是说内核把什么东西当做一个调度单?br /> </div> <div>拿Linux来说吧,Process是线E集和资源集<br /> </div> <div>调度的时候,那些׃n资源的TaskQthreadQ之间的调度肯定比那些跨Process不共享资源的thread做context switch消耗的资源</div> <div>多得多?br /> </div> <div></div> <div>Z调度消耗之cȝ考量</div> <div></div> <div>模型分ؓ下面几种<br /> </div> <div>一对一Q也是?user space create出来的线E就是和kernel的调度单位相同,UC一对应<br /> </div> <div>一对多Q应该是q样一U情况,kernel看到的是ProcessQuserspace自己实现出来自己的threadQ这个threadQkernel是不知道?/div> <div>调度的时候kernel负责分批CPUl他能看到的ProcessQ上层userspace自己来调度分配这个Process获得的CPU timel这个process中的</div> <div>各个U程?/div> <div>q样的分配就可以保证在一定的旉内只需要做一些register和stack的切换,不会有memory{等的switch?/div> <div>坏处是上面的thread只要一个被suspendQ那么这个Process里面的其他thread也就被suspend住了Q一般上层调度程?/div> <div>不会假定其他的thread能runQ所以一般会是kernel把CPU timel其他process<br /> </div> <div></div> <div>多对多,是一U؜合的情况了,我想CAndroidQ但是Android是一对一模型Qdalvik会保证Java thread对应下面一?/div> <div>native threadQ想说的是,q种虚拟机架构可以做成多对多的样子,一个native thread run一个JVMQJVM开出来很多Java ThreadQ?/div> <div>JVM负责调度q些Java ThreadQNative负责调度JVM所在的Thread?/div> <div>不知道我有没有讲错?br /> <br /> </div> <div></div> <div></div><img src ="http://www.shnenglu.com/xieshuo/aggbug/203804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/xieshuo/" target="_blank"> Torres</a> 2013-10-18 19:42 <a href="http://www.shnenglu.com/xieshuo/archive/2013/10/18/203804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>E序员自我修?MW记http://www.shnenglu.com/xieshuo/archive/2013/10/14/203710.html Torres TorresMon, 14 Oct 2013 09:07:00 GMThttp://www.shnenglu.com/xieshuo/archive/2013/10/14/203710.htmlhttp://www.shnenglu.com/xieshuo/comments/203710.htmlhttp://www.shnenglu.com/xieshuo/archive/2013/10/14/203710.html#Feedback0http://www.shnenglu.com/xieshuo/comments/commentRss/203710.htmlhttp://www.shnenglu.com/xieshuo/services/trackbacks/203710.html     q个书的名字我自p得有点屌丝风gQOrzQ期望编者勿?img src ="http://www.shnenglu.com/xieshuo/aggbug/203710.html" width = "1" height = "1" />

Torres 2013-10-14 17:07 发表评论
]]>
LTZ看书之APUE14http://www.shnenglu.com/xieshuo/archive/2013/06/07/200852.html Torres TorresFri, 07 Jun 2013 10:52:00 GMThttp://www.shnenglu.com/xieshuo/archive/2013/06/07/200852.htmlhttp://www.shnenglu.com/xieshuo/comments/200852.htmlhttp://www.shnenglu.com/xieshuo/archive/2013/06/07/200852.html#Feedback0http://www.shnenglu.com/xieshuo/comments/commentRss/200852.htmlhttp://www.shnenglu.com/xieshuo/services/trackbacks/200852.html

q个是Muxd一直用的东?br />相当于一个双向PIPE
Process A open ptm得到fdmQ然后fork出process BQprocess B open pts得到fdsQ然后将0,1,2都dup到fds?br />那么fds变成了process B的控制终?br />后面再process B中做标准IO操作的时候就会像PIPE直接影响到fdm
l端行规E在pts之上

没什么特别要记录的,在网上search了下Q脓个链接,里面会介l一些基本概?
http://www.cnblogs.com/Anker/archive/2012/12/25/2832568.html



Torres 2013-06-07 18:52 发表评论
]]>
LTZ看书之APUE13http://www.shnenglu.com/xieshuo/archive/2013/06/07/200842.html Torres TorresFri, 07 Jun 2013 06:40:00 GMThttp://www.shnenglu.com/xieshuo/archive/2013/06/07/200842.htmlhttp://www.shnenglu.com/xieshuo/comments/200842.htmlhttp://www.shnenglu.com/xieshuo/archive/2013/06/07/200842.html#Feedback0http://www.shnenglu.com/xieshuo/comments/commentRss/200842.htmlhttp://www.shnenglu.com/xieshuo/services/trackbacks/200842.htmll端IO
每个l端都有输入输出队列
队列都有长度Q如果输入超q输入队列MAX_INPUT长度Q大多数unixpȝ会回昑֓铃来处理?br />但是对于输出队列来讲Q虽然输出队列也有长度,但是一旦写不进ȝ时候,写进E会suspend?br />直至有空闲空?/p>

l端行规E?terminal line discipline
会帮忙做规范处理

l端讑֤属?->termios

struct termios {
 tcflag_t c_iflag;
 tcflag_t c_oflag;
 tcflag_t c_cflag;
 tcflag_t c_lflag;
 cc_t c_line;
 cc_t c_cc[NCCS];
};

local flag影响驱动E序和用户之间的接口
Android上tcflag_t->
typedef unsigned int tcflag_t;

cc_t
typedef unsigned char cc_t;

control flag中很多选项标志都是用几位标识然后用或来做选择

isatty的实玎ͼ借助tcgetattr的出错机Ӟ成功q回0Q否则返?1Q带上ENOTTY

int
isatty (int  fd)
{
  struct termios term;

  return tcgetattr (fd, &term) == 0;
}

AnywayQ终端IO很复?..



Torres 2013-06-07 14:40 发表评论
]]>
LTZ看书之APUE12http://www.shnenglu.com/xieshuo/archive/2013/06/06/200830.html Torres TorresThu, 06 Jun 2013 09:22:00 GMThttp://www.shnenglu.com/xieshuo/archive/2013/06/06/200830.htmlhttp://www.shnenglu.com/xieshuo/comments/200830.htmlhttp://www.shnenglu.com/xieshuo/archive/2013/06/06/200830.html#Feedback0http://www.shnenglu.com/xieshuo/comments/commentRss/200830.htmlhttp://www.shnenglu.com/xieshuo/services/trackbacks/200830.htmlIPC

首先讲到的是PIPEQ这个ƈ不陌生,怺通信的Process必须h关系Q一般是同父亲的
然后讲到了协同进E?br />基本是说有一个进E专门用来接收输入,然后处理Q然后返回结?br />q个可以用PIPE来实?/p>

创徏两个PIPEQ一个用于输入给协同q程Q另外一个用于接收协同进E的输出
fork之后在子q程中将标准输入输出都dup到管道上

而协同进E的写法可以比较commonQ只用关心标准输入输出?br />PIPE在写的时候如果有多个写进E,那么写的数据于 PIPE_BUF 则不会ؕ序,否则自己应该需要做同步了?/p>

然后是FIFOQ这个就是用mkfifo创徏一个fileQ大安ȝ?br />PIPE和FIFO都是半双工的

XSI IPC ->即之前System V IPC
消息队列 信号?׃n存储?/p>

在无兌E之间共享存储段Q一个是使用上面VpȝshmQ另外一个是使用mmap同一文gmapC们自qq程I间?br />
另外是|络IPC?br />是复习下吧Q之前这块儿看的比较?br />int socket(int domain, int type, int protocol)
domain标识address family -> AF_INET, AF_INET6, AF_UNIX(AF_LOCAL), AF_UNSPEC
type标识socketcd -> SOCK_DGRAM(UDP), SOCK_RAW(IP), SOCK_SEQPACKET, SOCK_STREAM(TCP)

一般protocol都设|ؓ0Q一般address family和typep认要用的protocol

SOCK_SEQPACKET和SOCKQSTREAM很像Q前一个提供面向数据报文的服务Q而后面这U则是面Ҏ?br />SOCK_SEQPACKET使用场景SCTPQ脓一个SCTP的简要介l?br />http://www.cnblogs.com/qlee/archive/2011/07/13/2105717.html

涉及|络必要清楚字节序的问题Q字节序与字W编码是两g不同的事情,都要x楚的Q但是要提一下UTF-8q是一U专门设计用来做|络传输的字W编?br />无需兛_字节序的问题Q所以传输的上层数据可以用UTF-8Q就不用担心local host和remote host的主机字节序不一栯导致ؕ序了?br />
但是很多协议头必dW合TCP/IP协议的字节序规范QTCP/IP是big endian
关于Big endian和Litter endian我比较容易忘记具体的样子Q但是他的出发点是低地址Q低地址装的是最高有效字节那么就是big endianQ否则就是litter endian?br />
关于socket有几个可能比较模p的地方
connectӞ也就是client端,如果fd没有l定到某个地址Q那么kernel会帮忙将其绑定到默认地址; 所以bindqg事情是Client和Server都需要做的事情,调用listen之前也一?br />然后accept的时候,如果你关心对方的地址Q那么提供addr(_)和lenQ返回的时候就能知道?br />另外UDP(SOCK_DGRAM)也可以Call connectQ之后就可以直接call send/writeQ而不必每ơ都call sendto指定对端地址?br />
sendto中flag一般给0Q如果是紧急数据给MSG_OOB

文g描述W的传输Q目的是惌不同的process在不同的文g描述W中׃n文g表?br />所以做法上pȝ会这P传输文g表指针然后放到接收端的第一个可用的文g描述W上?br />q个我在linux上没扑ֈ实现Q因个功能还是有蛮多替代Ҏ的?br />



Torres 2013-06-06 17:22 发表评论
]]>
LTZ看书之APUE11http://www.shnenglu.com/xieshuo/archive/2013/06/05/200818.html Torres TorresWed, 05 Jun 2013 08:59:00 GMThttp://www.shnenglu.com/xieshuo/archive/2013/06/05/200818.htmlhttp://www.shnenglu.com/xieshuo/comments/200818.htmlhttp://www.shnenglu.com/xieshuo/archive/2013/06/05/200818.html#Feedback0http://www.shnenglu.com/xieshuo/comments/commentRss/200818.htmlhttp://www.shnenglu.com/xieshuo/services/trackbacks/200818.html13章在讲Daemon ProcessQ没什么特别好写的?br />14 ->高IO

低速系l调用,也就是有信号发生会返?errno ?EINTR?/p>

盘文gIO虽然有gӞ但是q个不能是低速系l调?/p>

APUE介绍的低速系l调?br />PIPEQ终端设备,|络讑֤ d
L数据/写无I间(例如TCP卡Congestion window)

打开某些Ҏ文g
加记录锁的文件读?br />ioctlQIPC


文g锁又叫做 byte-range lockingQ针对特定的文g区域Q适合数据库文?br />Posix标准
int fcntl(int fd, int cmd, .../* struct flock* flockptr */)
cmd -> F_GETLK,F_SETLK,F_SETLKW
F_SETLKW是F_SETLK的Blocking版本 W means wait

重要数据l构是struct flock ->
struct flock {
 short l_type;
 short l_whence;
 off_t l_start;
 off_t l_len;
 pid_t l_pid;
 __ARCH_FLOCK_PAD
};

锁定整个file的方? l_whence = SEEK_SET, l_start = 0, l_len = 0

l_type的两clock
F_RDLCKQF_WRLCKq两U锁的特性很像rw lock

不过与读写锁不一L是或者这栯
Posix.1没有规定下面q种情况: process A在某文g区间上设|了一把读锁;process B试在这个文件区间加上写锁的时候suspendQprocess C再尝试获取读锁,如果允许

process C拿到读锁Q那么process B会可能永远拿不到写锁,zL饿死

pthread里面的rw lock的实C在这U情况下suspend掉process C的读锁请求;但是目前文g区域锁的实现我不太确?/p>

q里看文件区域锁q是比较Ҏ带来deadlock?br />例如process A锁住F1的某个区域,然后去锁F2的一个区域,q时候F2的这个区域被process B锁住Q那么process A׃suspendQ如果这个时候process Bq来要锁F1的这个区?br />׃发生deadlock


关于文g区域锁的l承和释?br />1.fork后,文g区域锁ƈ不承,l承了就完了Q不同的process有可能同时q同一件事情,把数据搞?br />2.close(fd)?fd对应的文仉p释放了,文g锁挂在inode上,close的时候kernel会去扫描对应的inode上与q个PID相关的lockQ释放掉Q而ƈ不去兛_是哪个文件描q符?/p>

者是哪个文g表,q很重要Q因为lockf中ƈ不记录fdQ他们只是弱兌关系Q这个很重要?br />3.exec后,文g锁会l承原来执行E序的锁(fork之后拿到的lock)Q如果fd带有close-on-exec那么ҎW二条,q个fd对应的file上的锁都会被释放?/p>


后面讲了STREAMSQ感觉linux上用到的不多Q需要在~译kernel时动态加?/p>

IO多\转接Q主要是Z实现polling既所谓的轮询
主要函数有selectQpselectQpollQepoll
select也会是低速系l调用,那么有可能被信h?br />pselect有参数可以设定信号屏蔽集Q也提供更高_ֺ的timer

poll的方式与select有不太一L地方Q但是功能相同,epoll更适合大数据量?/p>

readv和writev
C下面两条够?br />一个称为scatter read(散步?Q另外一个称为gather write(聚集?
q两个函C面对一个buffer链表?br />


readn和writen
q个比较像现在Android里面socket的read和write方式Q保证能read/write n byte数据Q在内部做@?br />我比较好奇这两个是否会处理signalQ想来应该是会处理的Q遇到EINTR帮忙重启好?/p>

我没有找到Bionic库的实现


存储映射IO
q个很重要,mmap用的很多Q映到processI间的位|在 stack以下Qheap以上的部分,map完后q回低地址?/p>

#include<sys/mman.h>
void* mmap(void* addr, size_t len, int prot, int flag, int filedes, off_t off)

prot -> PROT_READ,PROT_WRITE,PROT_EXEC,PROT_NONE
prot指定的对映射存储区的保护不能过文g的open权限

?flag?MAP_FIXED的时候OS会保证分配的memory起始地址为addrQ否则只是给OS一个徏议?br />一般徏议addrl?Q让OS来决定?/p>

MAP_SHARED是说Ҏ区域的存储(write)会导致修改该文g?br />MAP_PRIVATE则是Ҏ区域的操作会常见一个映文件的副本?br />


后面有个例子用了lseek
使用lseek增加文g长度的方式,先lseek一个|如果q个值大于文件本w的长度Q那么下一ơ写׃加长该文Ӟq且在文?br />中Ş成一个空z,未写q的内容全部Mؓ0?br />mmap只能map文g的最大长度,过的地Ҏ办法同步到文件?/p>

Torres 2013-06-05 16:59 发表评论
]]>
þþ뾫Ʒպ| ٸþĻ| Ʒ99Ʒþ| 2022Ʒþþþ | ŷ޾Ʒ˾þԻӰƬ| ҹƷþþĸ | þþƷĻһ| þƵ1| þۺĻ| þþƷȫۿ| Ʒþþþþø69| þþ뾫Ʒҹ| Ʒþþø| Ʒ99þþþþ鶹| ˾þں2019| ƷëٸAVѾþ| þúݺһƷۺ| ۲˾þþƷٸAV| þɫۺһ| þѾƷƵ| 7777Ʒþþô߽| ŷպĻþþò| þw5www| AëƬþþƷ| ƷþþĻһ| þþþþþۺ | Ʒþþþù| 2022Ʒþþþ| ޾Ʒרþþ| ˾þô߽鶹| þþùƷ| þþƷAV| ܻƺ۵վþmimiɫ| պƷþþþþ| ߳߳þþ91 | þþƷѹۿ| þŮƵ| 99þҹɫƷվ| ƷŮþþþAV| Ʒþһ| 97þþƷҹһ|