Monthly Archives: February 2013

关于unix环境的进程时间

Unix环境的进程时间有三个度量值:

    1.Wall Clock time : 把进程的执行当作一个黑盒,人类所感知的起止时间的差。

    2.User CPU time :   执行用户态指令所花的CPU时间。

    3.System CPU time : 内核代表进程执行时所花的CPU时间。

2和3合并起来称为 CPU time.

shell中可以用time测量一下执行进程所花的时间:

引用

$ time -p curl facebook.com > /dev/null  #故意访问一个访问不到的网站

得到:

real 63.15   #即Wall Clock Time, 进程一共执行了63秒

user 0.00

sys 0.01     #user cpu time 和sys cpu time都很短,说明大部分时间花在I/O等待上

linux:为什么要在应用程序和硬件之间添加系统调用层

有三个作用:

    1.为应用程序提供友好的、屏蔽硬件细节的接口

    2.避免应用程序通过不当的方式来访问硬件,保护硬件,也可以避免一个进程破坏另一个进程的内存等数据

    3.如果不经系统调用访问硬件,内核就无法跟踪协调用者,也无法实现虚拟内存等机制。

 

实验:执行不同代码时,linux进程的状态

sleep()时,进程处于什么状态? 执行代码或者等待I/O时又处于什么状态?

下面是一个不太完整的实验。

//下面代码启动后,请不停地用ps查看进程的状态
int main(){

        sleep(10);   //此时状态是"S", 即“可中断的等待”
        printf("sleep done\n");

        printf("Ready to connect non existing server\n");
        connect_server_fake_port();  //连接服务器上一个没有打开的端口,直到超时退出。 此时状态也是"S",进程处于阻塞中
        printf("done with connecting non existing server\n");

        printf("ready for for-ever loop\n");  
        while(1); //此时状态是"R", 说明进程在就绪队列中
}

linux:磁盘缓冲区和页高速缓存的联系与区别

摘自:
http://stackoverflow.com/questions/6345020/linux-memory-buffer-vs-cache

概念上的区别:

  1. buffer是块设备的内存读写缓冲区,而page cache是文件系统的概念。

  2. A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.

 

但事实上: 

  1. 由于linux使用了页回写技术,所以现在page cache也起到了buffer类似的作用:先把数据写到page cache中并置为"dirty",后台进程在适当的时间再把它冲刷到磁盘上。

  2. 既然两者的角色很模糊,所以在linux2.4以后,两者在内存里是同一块区域。在2.4之间,数据会被缓存两次,浪费内存;2.4以后,数据只会缓存一次了。不过,buffer的概念仍然保留着,shell中使用free命令仍然能看到buffer项的存在。

 

 

引用

Short answer: Cached is the size of the page cache. Buffers is the size of in-memory block I/O buffers. Cached matters; Buffers is largely irrelevant.

Long answer: Cached is the size of the Linux page cache, minus the memory in the swap cache, which is represented by SwapCached (thus the total page cache size is Cached + SwapCached). Linux performs all file I/O through the page cache. Writes are implemented as simply marking as dirty the corresponding pages in the page cache; the flusher threads then periodically write back to disk any dirty pages. Reads are implemented by returning the data from the page cache; if the data is not yet in the cache, it is first populated. On a modern Linux system, Cached can easily be several gigabytes. It will shrink only in response to memory pressure. The system will purge the page cache along with swapping data out to disk to make available more memory as needed.

Buffers are in-memory block I/O buffers. They are relatively short-lived. Prior to Linux kernel version 2.4, Linux had separate page and buffer caches. Since 2.4, the page and buffer cache are unified …

 

linux中断处理:Top Half和Bottom Half

当网卡发出中断时,内核会先把数据读取进来并回送响应,然后再处理和操作数据包。

中断处理程序应该快速完成。所以一般只把上面两步的第一步作为中断处理程序,执行完后把控制权交还给进程,第二步以后再进行。

快速完成的中断处理程序在Linux中称为Top Half(上半部),剩下的处理任务则是Bottom Half(下半部).

Top Half执行时一般还会屏蔽当前中断线上的新中断,而Bottom Half执行时就没有这个必要。

linux的系统调用是用中断实现的

linux的系统调用并不是像普通的函数调用那样直接在用户进程空间完成的,它是通过中断实现的,即:发出中断 + 调用中断服务程序。

以x86体系为例,

    1. 用户进程在执行系统调用前,先把系统调用名(实际上是系统调用号)、输入参数等放到寄存器上(EBX,ECX等寄存器)

    2. 然后发出int 0x80指令,即触发128号中断

    3. 系统暂停用户进程,根据128号中断找到中断服务程序,这个程序名就叫system_call()

    4. system_call()接着执行。它会从寄存器中找到系统调用名、输入参数等,并根据系统调用上下文中找到引发系统调用的进程;执行完毕后它又会把输出结果放到寄存器中。

    5. 系统恢复用户进程,进程从寄存器中取到自己想要的东西,然后继续执行。

   

补充说明:

    系统调用的中断一般称为软中断