技术分享 -- 209




概念所谓的死锁,就是两个或两个以上的进程在执行过程中,因为争夺某个资源而造成的相互等待的现象,如果没有外力作用,则他们都会因为等待而无法继续执行,死锁有时也称为“抱死”死锁的条件死锁的发生必须具备以下四个条件:互斥条件 -- 进程对分配到的资源进行排他性使用,即在一段时间内,某资源只能由一个进程占用,其他需要使用该资源的进程则必须等待请求和保持条件 -- 进程已经占用了某个排他性资源,但又提出了新的资源请求,而该资源又被其他进程占用,因此,此时执行进程阻塞,但又不释放自己已持有的资源不剥夺条件 -- 进程已获得资源在未使用完之前,不能被剥夺,只能在使用完之后由自己释放环路等待条件 -- 即P0正在等待P1占用的资源;P1正在等待P2占用的资源。。。Pn正在等待P0占用的资源,形成资源的环形链 
#读书笔记    #技术帖    #操作系统    #os   
进程原语与线程原语的比较进程原语线程原语描述forkpthread_create创建新的控制流exitpthread_exit从现有控制流中退出waitpidpthread_join从控制流中得到退出状态atexitpthread_cleanup_push注册退出控制流时调用的函数getpidpthread_self获取当前控制流IDabortpthread_cancle请求控制流的非正常退出 
#读书笔记    #技术帖    #linux    #unix   
问题写了一个小程序<?php $xml = file_get_contents('x.xml'); $obj = simplexml_load_string($xml); var_dump($obj); ?> <!-- x.xml --> <?xml version="1.0" encoding="utf-8"?> <wl_website_spider> <source_category><![CDATA[AVC_TEST]]></source_category> <source_website><![CDATA[SHAREWARE]]></source_website> <source_press><![CDATA[3]]></source_press> <proxy><![CDATA[OFF]]></proxy> </wl_website_spider> 结果无法读取到xml的内容,去掉<![CDATA[]>就可以,是simplexml_load_string(simplexml_load_file
#技术帖    #php    #xml    #技术分享   
概念又称僵尸进程,在子进程退出时,会将子进程的有关信息发送给父进程,让其父进程对其进行善后处理(如释放他仍占用的资源),如果他的父进程没有对 SIGCHLD 做出响应或忽略该信号或调用 waitpid 等待子进程结束,则子进程无法正常结束而成为僵死进程,即使是 root 身份调用 kill -9 命令也不能杀死僵死进程 将死进程通过 ps 命令查看其标志为 Z 避免产生僵死进程的方法1、waitpid子进程死后,会发送 SIGCHLD 信号给父进程,父进程收到此信号后会执行 waitpid 函数为子进程收尸2、处理 SIGCHLD 信号父进程可以对 SIGCHLD 信号进行响应,在处理函数中执行默认的处理或显示忽略该信号,则系统会自动释放子进程资源而避免使子进程成为僵死进程3、杀死父进程由于父进程死后,子进程以及僵死进程会成为孤儿进程,会被过继给守护进程(pid为1的init进程),init进程会负责清理僵死进程4、fork 两次在建立子进程时,使用2次fork,让所建立的子进程成为父进程的孙子进程,而实际中的子进程则随即推出,和第三条相同,由于孙子进程的
#技术帖    #linux    #unix    #apue   
终止进程快捷键的区别 -- CTRL + Z + C + / + 4 + DCTRL+C 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序CTRL+Z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程CTRL+/ 部分UNIX系统也实现为 CTRL+4,发送 SIGQUIT 信号给前台进程组中的所有进程,终止前台进程并生成 core 文件,通常存放在 /proc/sys/kernel 目录下,以进程 pid 命名CTRL+D 发送一个特殊的二进制值,表示EOF SIGKILL、SIGTERM、SIGQUIT、SIGINT 区别SIGINT CTRL+C 将发送该信号,用于终止前台进程组中的所有进程(只能终止前台进程),可以在进程中捕获SIGTERM 没有关联任何按键,只能由进程或命令发送,可以终止任何进程,也可以在进程中捕获SIGQUIT CTRL+\(部分实现为 CTRL+4)将
#技术帖    #linux    #unix    #技术分享   
一、加锁以及防止程序意外崩溃每台机器上布2个 schedule 进程,在rabbitmq中放一个任务键值,两个进程哪个取到这个键即进行后续工作,另一个处于等待状态当工作处理完毕,重新插入该键值,如果插入失败,直接退出,插入成功则ack 二、集群控制及调度周期控制在缓存中建立 id => schedule_time 的对应关系,每次获取当前时间以前的所有ID,然后进入第三步,处理结束后,zadd,如果调度程序中途退出,可以保证该id被调度 三、减轻MYSQL压力以及防止缓存意外崩溃将数据库中字段组成xml存入缓存,调度程序如果在缓存中没有查到ID(缓存意外崩溃),那么到数据库中差找字段插入缓存,否则直接从缓存读取一个守护进程定时同步数据库与缓存之间的数据 
#技术帖    #技术分享    #work    #工作   
问题/* * file: main.c * author: 龙泉居士 * date: 2012-12-22 05:23 */ #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUMBER_OF_THREADS 10 void *print_hello_world (void *tid) { printf ("Hello World from thread %d\n", tid); pthread_exit (NULL); } int main (int argc, char *argv[]) { pthread_t threads[NUMBER_OF_THREADS]; int status, i; for (i=0; i<NUMBER_OF_THREADS; ++i) { printf ("Main Hear, Creating thread %d\n", i); status = pthread_create (&threads[i], NULL, print_hello_world, (void *)i); if (sta
#技术帖    #linux    #unix    #c语言   
问题C++ programming language 第309页的例子:template <class C> class Basic_ops //基本操作类 { public: bool operator== (const C&) const; bool operator!= (const C&) const; // ... const C& derived () const //获得操作访问权 { return static_cast <const C&> (*this); } }; template <class T> class Math_container : public Basic_ops < Math_container<T> > //具体实现的容器类 { public: size_t size() const; T& operator[] (size_t); const T& operator[] (size_t) const; // ... }; 这样,使得有关容器的基本操作定义可以与容器本身的定义分开,而且只需定义一次&n
#读书笔记    #技术帖    #c++    #cpp   
问题难道在栈上也可以动态开辟数组了/* * file: main.c * author: 龙泉居士 * date: 2012-11-20 06:12 */ #include <stdio.h> int main () { int n; scanf ("%d", &n); int a[n], i; for (i=0; i!=n; ++i) { int x; scanf ("%d", &x); a[i] = x; } for (i=0; i!=n; ++i) printf ("%d ", a[i]); printf ("\n"); return 0; } 无聊中写了一个程序居然编译通过运行正常,这这这。。。什么状况。。。整个三观都颠覆了,这样的程序不应该可以编译通过啊,难道在栈上也可以动态开辟数组? 解答Variable-length array,在这里有叙述: For example, the GNU C Compiler allocates 
#技术帖    #linux    #unix    #技术分享   



京ICP备15018585号