Copy-on-write (CoW) As we discussed, the fork syscall creates an exact copy of the parent process. xv6 imple- ments it using the “direct copying” approach, which simply makes a copy of the parent’s memory and other resources. However, as we know, this way is not efficient. In this project, you are going to add the CoW functionality to the xv6 OS. Here are some hints for completing the work: 1.In xv6, when a process calls fork() to create a new copy of itself, the kernel creates a new page table for child process and clone all the pages of parent by calling copyuvm(). Look at fork() and copyuvm() for more details. Here one key piece of work is that you will need to implement your own copyuvm() that has the CoW support, along with other changes to enable CoW in xv6. 2.When either the parent process or the child process tries to write to a read-only page, the CPU will raise a page fault exception. The faulting address can be retrieved from the control register cr2. You can use function rcr2() to get the faulting virtual address. 3.Function flush tlb all() can be used to flush the TLB. Testing your CoW Implementation The test program source code (cowtest.c) has been given in the base code. The four test cases are explained as follows. 1.The parent process creates one child processes. Before fork(), the parent checks the number of free memory frames1 (short as “NFMF” in the following) (suppose it is v1). After fork(), the parent just checks NFMF (suppose it is v2).The child first sleeps for some time (to let the parent finish its job), then checks the NFMF (suppose it is v3).After the parent calls wait() for its child process, it checks the NFMF (suppose it is v4). A correct CoW implementation should have the following: (a) v1 == v4, otherwise memory frames leak happened with your implementation.(b) v2 == v3, and the value of (v1?v2) when with CoW (i.e., your implementation) should be smaller than that when without CoW (i.e., the base code). 2.The parent process creates one child processes. Before fork(), the parent checks the NFMF (v1).After fork(), the parent just checks th代写C语言、代做Copy-on-write、代写C++/C编e NFMF (v2). The child first sleeps for some time (to let the parent finish its job),, then checks the NFMF (v3), reads a global variable, and checks the NFMF (v4) again. 1To check the NFMF, call function print free frame cnt(), which prints the number of free memory frames at the time of calling. 2.After the parent calls wait() for its child process, it checks the NFMF (v5). A correct CoW implementation should have the following: 1.(a) ?v1 == v5, otherwise memory frames leak happened with your implementation. 2.(b) ?v2 == v3 == v4, and the value of (v1 ? v2) when with CoW should be smaller than that when without CoW.3. The parent process creates one child processes. Before fork(), the parents checks the NFMF (v1). After fork(), the parents checks the NFMF (v2), reads a global variable, checks the NFMF (v3) again. The child first sleeps for some time (to let the parent finish its job), then checks the NFMF (v4), modifies the global variable, and checks the NFMF (v5) again; After the parent calls wait() for its child process, it checks the NFMF (v6). A correct CoW implementation should have the following: (a) v1 == v6, otherwise memory frames leak happened with your implementation. (b) v2==v3==v4,and v4?v5==1. 4. The parent process creates one child processes, and there is a global array A that spans two pages (page size is 4096 byte). Before fork(), the parents checks the NFMF (v1). After fork(), the parents checks the NFMF (v2), modifies an array element of A that locates in the first page, checks the NFMF (v3) again; The child first sleeps for some time (to let parent finish its job), then checks the NFMF (v4), modifies an array element of A that also locates in the first page, and checks the NFMF (v5). Then the child modifies an array element of A that locates in the second page, and checks the NFMF (v6) again; After the parent calls wait() for its child process, it checks the NFMF (v7). A correct CoW implementation should have the following: (a) v1 == v7, otherwise memory frames leak happened with your implementation. (b) v2?v3 == 1,v3 == v4 == v5,and v5?v6 == 1. 转自:http://www.3daixie.com/contents/11/3444.html
讲解:C、Copy-on-write、C++/CCR|R
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Copy-on-write (CoW) As we discussed, the fork syscall cre...