随笔分类 -  Computer Systems

摘要:1、unix风格的错误机制下,当函数,如wait执行出错后,it returns -1 and sets the global variable errno to an error code that indicate the cause of the error.如果成功,则返回有用的结果。 if ((pid = wait(NULL)) < 0) { fprintf(stderr, "wait... 阅读全文
posted @ 2011-07-30 13:33 浪里飞 阅读(491) 评论(0) 推荐(0)
摘要:1、基于预线程化(prethreading)的并发服务器常规的并发服务器中,我们为每一个客户端创建一个新线程,代价较大。一个基于预线程化的服务器通过使用“生产者-消费者模型”来试图降低这种开销。服务器由一个主线程和一组worker线程组成的,主线程不断地接受来自客户端的连接请求,并将得到的连接描述符放在一个共享的缓冲区中。每一个worker线程反复从共享缓冲区中取出描述符,为客户端服务,然后等待下一个描述符。示例代码/* * echoservert_pre.c - A prethreaded concurrent echo server *//* $begin echoservertprema 阅读全文
posted @ 2011-07-30 10:51 浪里飞 阅读(995) 评论(0) 推荐(0)
摘要:1、共享变量1)线程存储模型线程由内核自动调度,每个线程都有它自己的线程上下文(thread context),包括一个惟一的整数线程ID(Thread ID,TID),栈,栈指针,程序计数器,通用目的寄存器和条件码。每个线程和其他线程一起共享进程上下文的剩余部分,包括整个用户的虚拟地址空间,它是由只读文本(代码),读/写数据,堆以及所有的共享库代码和数据区域组成的,还有,线程也共享同样的打开文件的集合。[1]寄存器从不共享,而虚拟存储器总是共享。The memory model for the separate thread stacks is not as clean(整齐清楚的). Th 阅读全文
posted @ 2011-07-10 11:04 浪里飞 阅读(703) 评论(0) 推荐(0)
摘要:1、如果逻辑控制流在时间上重叠,那么它们就是并发的。这种现象,称为并发(concurrency)。2、为了允许服务器同时为大量客户端服务,比较好的方法是:创建并发服务器,为每个客户端创建各自独立的逻辑流。现代OS提供的常用构造并发的方法有:进程和线程。1)每个逻辑流都是一个进程,由内核来调度维护。每个进程都有独立的虚拟地址空间,控制流通过IPC机制来进行通信。2)线程:运行在单一进程上下文中的逻辑流,由内核进行调度,共享同一进程的虚拟地址空间。由于进程控制和IPC的开销较高,所以基于进程的设计比基于线程的设计慢。常见IPC有:管道,FIFO,共享存储器,信号。3、基于线程的并发编程线程由内核自 阅读全文
posted @ 2011-07-10 09:57 浪里飞 阅读(1221) 评论(1) 推荐(0)
摘要:1、Web服务器以两种不同的方式向客户端提供内容:1)静态内容(static content):从服务器磁盘取得文件并把它返回客户端来服务。2)动态内容(dynamic content):运行一个可执行文件,并把它的输出返回给客户端。在服务器上一个子进程的上下文中运行一个程序并将它的输出返回给客户端来服务。2、在URL中,“?”用来分隔文件名和参数,多个参数用“&”来分隔。参数中不允许空格,用“%20”来表示。3、确定一个URL指向的是静态内容还是动态内容没有标准的规则。一种常见的方法是,确认一组目录,如cgi-bin,所有的可执行性文件都放在这这些目录中。https://mail.q 阅读全文
posted @ 2011-07-09 11:01 浪里飞 阅读(404) 评论(0) 推荐(0)
摘要:1、每个网络应用都是基于客户端-服务器模型的。客户端-服务器模型中的基本操作是事务(transaction)(这里的事务与数据库中的事务有区别,没有数据库事务的特性,如原子性,这时原事务仅仅是客户端和服务器之间执行的一系列步骤)。认识到客户端和服务器是进程,而不是在本上下文中常被称为的机器或者主机。 2、网络 一个以太网段,包括电缆和集线器;每根电缆都有相同的最大位带宽;集线器不加分辩地将一个端... 阅读全文
posted @ 2011-07-07 23:06 浪里飞 阅读(696) 评论(1) 推荐(0)
摘要:1、一个unix文件就是一个m字节的序列(b0b1b2...bm-1)。所有的IO设备,如网络,磁盘,终端,都被模型化为文件,而所有的输入和输出都被当作对相应文件的读和写来执行。 2、所有的输入和输出都被当作统一的方式来处理: 1)打开文件。一个应用程序通过要求内核打开相应的文件,来宣告它想要访问一个IO设备。内核返回一个小的非负整数,叫做描述符,它在后续对此文件的所有操作中标识这个文件。内核记... 阅读全文
posted @ 2011-07-03 22:30 浪里飞 阅读(935) 评论(0) 推荐(0)
摘要:1、垃圾收集器将存储器视为一张有向可达图(reachability graph)。 2、Mark%Sweep垃圾收集器由标记(mark)阶段和清除(sweep)阶段组成。标记阶段标记出根节点的所有可达的和已分配的后继,而后面的清除阶段释放每个被标记的已分配块。典型地,块头部中空闲的低位中的一位来表示这个块是否被标记了。 Note that the arrows in this example ... 阅读全文
posted @ 2011-06-29 22:20 浪里飞 阅读(401) 评论(0) 推荐(0)
摘要:1、需要额外的虚拟存储器时,使用一种动态存储器分配器(dynamic memory allocator)。一个动态存储器分配器维护着一个进程的虚拟存储器区域,称为堆(heap)。在大多数的unix系统中,堆是一个请求二进制0的区域;对于每个进程,内核维护着一个变量brk,它指向堆的顶部。 2、分配器将堆视为一组不同大小的块(block)的集合来维护。每个块就是一个连续的虚拟存储器组块(chunk... 阅读全文
posted @ 2011-06-29 16:59 浪里飞 阅读(798) 评论(0) 推荐(0)
摘要:1、Linux通过将一个虚拟存储器区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟存储器区域的内容,这个过程称为存储器映射(memory mapping)。虚拟存储器区域可以映射到两种类型的对象: 1)unix文件系统中的普通文件:一个区域可以映射到一个普通磁盘文件的连续部分。 2)匿名文件:一个区域也可以映射到一个匿名文件,匿名文件是由内核创建的,包含的全是二进制零。 一旦一... 阅读全文
posted @ 2011-06-25 23:17 浪里飞 阅读(877) 评论(0) 推荐(0)
摘要:1、Pentium地址翻译的情况 1)页表 每个pentium系统都使用如图所示两级页表。 每个进程都有一个惟一的页面目录和页表集合。页面目录基址寄存器(page directory base register, PDBR)指向页表目录的起始位置。 2)PDE与PTE格式 Write-through 直写;write back: 写回。 Pentium页表条目缺少一个执行许可证,用来控制一个页... 阅读全文
posted @ 2011-06-25 10:42 浪里飞 阅读(830) 评论(0) 推荐(0)
摘要:1、地址翻译,是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)中元素之间的映射。 2、CPU中的一个控制寄存器,叫做页表基址寄存器(page table base register,PTBR)指向当前页表。N位的虚拟地址包含两个部分:一个p位的VPO(virtual page offset,虚拟页面偏移)和一个n-p位的VPN(virtual page numbe... 阅读全文
posted @ 2011-06-24 21:16 浪里飞 阅读(1304) 评论(0) 推荐(0)
摘要:2)页命中 3)缺页 DRAM缓存不命中称为缺页(page fault)。 VM page fault (before). The reference to a word in VP 3 is a miss and triggers a page fault. VM page fault (after). The page fault handler selects VP 4 as the vi... 阅读全文
posted @ 2011-06-23 17:49 浪里飞 阅读(1056) 评论(0) 推荐(0)
摘要:1、一个系统中的进程是与其他进程共享CPU和主存资源的。 2、虚拟存储器(Virtual Memory),是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完善交互,它为每个进程提供一个大的,一致的,私有地址空间。通过一个清晰的机制,虚拟存储器提供了三个要重的能力:它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,... 阅读全文
posted @ 2011-06-23 16:59 浪里飞 阅读(1789) 评论(0) 推荐(0)
摘要:1、人不能够觉察短于大约100ms的时间段。2、计算机有一个外部计时器,它周期性地向处理器发送中断信号。这些中断信号之间的时间被称为间隔时间(interval time)。3、从一个进程切换到另一个进程需要几千个时钟周期来保存当前当前进程的状态。典型的计时器间隔范围是1~10ms。4、通过间隔计数(interval counting)来测量时间OS也用计时器(timer)来记录每个进程使用的累计时间,这种信息提供的是对程序执行时间不那么精确的测量值。这种方法只对长持续时间(到少1s)的测量有用。OS维护着每个进程使用的用户时间量和系统时间量的计数值。通过如下两种方法读进程的计数器1)shell 阅读全文
posted @ 2011-06-20 23:52 浪里飞 阅读(839) 评论(0) 推荐(0)
摘要:1、C提供了用户级异常控制流,称为非本地跳转(nonlocal jump),它将控制流从一个函数转移到另一个当前正在执行的函数;而不需要经过正常的调用-返回序列。通过setjmp和longjmp来实现的。函数原形#include <setjmp.h>int setjmp(jmp buf env);int sigsetjmp(sigjmp buf env, int savesigs); //信号版本returns: 0 from setjmp, nonzero from longjmps)#include <setjmp.h>void longjmp(jmp buf en 阅读全文
posted @ 2011-06-18 11:36 浪里飞 阅读(1129) 评论(0) 推荐(0)
摘要:1、更高层软件形式的异常,称为unix信号,它允许进程中断其他进程。一个信号(signal)就是一条消息,它通知进程一个某种类型的事件已经在系统中发生了。Linux支持30种不同类型的信号。2、以前,主存储器是用一种称为磁芯存储器(core memory)的技术来实现的。“转储存储器(dumping core)”是一个历史术语,意为把代码和数据存储器段的映像写到磁盘上。3、传送一个信号到目的进程是由两个不同步骤组成:1)发送信号:内核通过更新目的进程上下文中的某个状态,发送(delivers/sends)一个信号给目的进程。发送信号可以有如下两种原因:内核检测到一个系统事件,比如除0或子进程终 阅读全文
posted @ 2011-06-17 17:26 浪里飞 阅读(1134) 评论(0) 推荐(0)
摘要:1、获取进程ID[1]每个进程都有一个唯一的正数(非0)进程ID(PID)。示例代码#include <unistd.h>#include <sys/types.h>pid t getpid(void);pid t getppid(void);returns: PID of either the caller or the parent The getpid and getppid routines return an integer value of type pid_t, which on Linux systems is defined in types.h as 阅读全文
posted @ 2011-06-17 12:02 浪里飞 阅读(755) 评论(0) 推荐(0)
摘要:1、系统中可能的每种类型的异常都分配了一个惟一的非负整数的异常号(exception number)。这些号码中的某一些是由处理器的设计者分配的,其他号码是由操作系统内核的设计者分配的。前者如:除0项,缺页,存储器访违例,断点,算术溢出;后者的示例包括系统调用和来自外部I/O设备的信号。在系统启动时,OS分配的初始化一张称为异常表的跳转表,使得表目k包含异常k的处理程序的地址。2、如果控制从一个用户程序转移到内核,所有这些项目(item)都被压到内核栈中,而不是压到用户栈中。异常处理程序运行在内核模式下,这意味着它们对所的资源都有完全的访问权限。3、现代OS把这些突发改变(abrupt cha 阅读全文
posted @ 2011-06-16 20:54 浪里飞 阅读(736) 评论(0) 推荐(0)
摘要:1、可执行目标文件注:ELF(Executable and Linkable Format)从上图中可以看出,代码段的地址总是比数据段的地址小。2、加载可执行目标文件任何Unix程序都可以通过调用execve函数来调用加载器。加载器将可执行目标文件中的代码和数据从磁盘拷贝到存储器中,然后通过跳转到程序的第1条指令,即入口点(Entry Point),来运行该程序。将程序拷贝到存储器并运行的过程叫做加载(loading)。每个Unix程序都有一个运行时存储器映像,如图中。在Linux系统中,代码段总是从地址0x08048000处开始。数据段是在接下来的下一个4KB对齐的地址处。堆在接下来的读/写 阅读全文
posted @ 2011-06-15 23:09 浪里飞 阅读(858) 评论(0) 推荐(0)