《给你一个公司,你能管好吗》

做好“甩手掌柜”,少拿主意,多出主意,尽量启发性的“无为而治”,避免“事事躬亲”。
忙则乱,注意力过于集中,视野就会狭隘。
闲则观,看着出的主意,看着执行者,在更高的角度思考和观察大局。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
我与网络安全征文 在二十一世纪的中国,电视机已迈入了千家万户,但是随着经济 的发展,技术的提高,电脑在二十一世纪成了人们的新宠儿。 二十一世纪是一个充满着竞争的信息时代,电脑使人们的学习和 信息交流变得更加得丰富多彩,使知识的获得更加便捷。 有一次老师让我查找一位历史人物的资料,我翻阅了许多的书 籍,但还是没有找到所要的资料,真是心急如焚。可是后来上网一查, 不出一会,便找到了资料。这次能找到资料,真是多亏了电脑网络呀! 我上一次在电视上看到,有一个村的几十户农民开发资源,种植 了好几亩的绿色蔬菜,但是一直没有人来订购出去。一个学电脑的人 帮助他们想了个办法,上网找客户。一下子,许多客户都在网上下了 定单。没过几天,便把这成堆的蔬菜销售一空。这些蔬菜被放在家中 腐烂的命运,被一台小小的电脑所改变了,这是多么的神奇呀! 像上而一样的电脑"事迹"举不胜举。它在公司企业中,在人们的 生活中渐渐成为了一个非常重要而必不可缺的工具。但是我们也必须 清楚,网络在给我们带来益处的同时,也存在着相当的负面影响。 我与网络安全征文全文共4页,当前为第1页。一些青少年不能正确认识网络,上网白文明不健康,通宵达旦打 游戏、聊天,浏览不良信息,沉迷于上网,甚至不顾身体健康,无节 制上网。我曾听到过一条消息:一个男生在网吧打游戏,不吃不喝也 不休息,可到了第三天早上,因为体力不支而昏倒在地,送到医院抢 救。可为时己晚。死因是累死的。我听到这里时候,觉得这是非常不 可思议的事。一个好好的人,却为一个虚幻的世界而失去了宝贵的生 我与网络安全征文全文共4页,当前为第1页。 看到这里,许多人自然而然地觉得网络真是坏呀!可在我看来网 络是无法区分好与坏的,重要得是你怎样看待与利用网络了。如果没 有正确看待网络便会像那个少年一样,沉迷于上网而无法自拔;如果 你能正确利用网络,它便不是一把无形的剑,而是一位好助手。 但是要使每一个人都正确认识网络,我认为教育、管理是关键。 一些网吧、游戏室阳奉阴违,明明标有"未成年人不得入内"的醒目字 样,可还是有一大批中小学生进出来往。像这样的现象,有关部门可 以定期抽查。学校与家长也要对沉迷于网络的少年进行教育和劝戒。 还有一些网上的不良信息的发布要加以杜绝和制止。 希望未来的人们上网能看到一个没有不良信息,没有暴力和血腥 的游戏,成为一个真正的"健康绿色的网络"。 我与网络安全征文 在现实生活中,人们相互交往时都很注意讲文明、讲礼貌,愿意 展示自己有文化、有修养、有良好品行的美好形象。在虚拟社会中, 人们交往互不谋而,可能交往的双方永远不知道对方是谁。互联网带 给了人们便利,也埋藏了巨大的隐患,如今"某市十几岁小孩见网友 被拐"之类的新闻层出不穷,像QQ,微信等网络聊天平台,他们就像 一个假面舞会,你看到的也许只是表面上的美好,而却不知道这个人 而具下的贪财好色,心狠手辣。 我与网络安全征文全文共4页,当前为第2页。我记得挺清楚的,在我三、四年级的那个时候吧,刚开始接触 QQ,孜孜不倦的加着好友,聊着天。不知哪天,有一个人请求加我 为好友,那时,也没想那么多就同意了。刚开始,聊得挺来的,更多 的是一些关于生活的话题,后来可能是见我什么都不懂就开始得寸进 尺了吧,说一些很无耻的的话,再后来就给我发一些龌龊的图片,简 直不堪入目,我就把他拉黑删除加举报了。也不知道那个时候的我心 里怎么想的,可能是觉得恶心,变态吧!不过现在想起来也确 如此。 有时我也很庆幸,一想起这件事就很感谢那时的自己,我不敢想象, 如果我没有那样做,等待我的又会是什么?就像那些新闻上的小女孩 一样吗?被拐卖到荒郊野外?甚至更惨更惨…… 我与网络安全征文全文共4页,当前为第2页。 我们青少年正处于成长时期,阅历少,经验不足,在网络这个缤 繁世界游历时,一定要注意树立自我保护意识,在自己的头脑里建立 起"安全防火墙",以抵御不良信息对我们的影响。标明限制信息的, 如果自己处在限制区域内,一定不能进入。目前网上也有不少骗子, 利用孩子的轻信和好奇心约会孩子到某地会合。这样的事儿即使你认 识对方,也必须和家长商量,时刻都不能放松警惕。最重要的是,不 管什么时候,都不能轻易将个人资料发布在网上。 无论如何,都要有一个警惕的心,如果你是一个哥哥或者姐姐, 请你告诉你的弟弟妹妹,网络交友需谨慎。如果你是家里的独生子女, 那么你要更加小心。如果有网友邀你会面,那么你得三思而后行,毕 竟他只是网友,不是你的"白雪公主"或"口马王子",他可能是你真正 的朋友,也可能是无恶不做的坏蛋。你一定要学会说:"不"。 我们应该利用网络来学习知识,远离那些不堪入眼的资料。但在 我们查阅资料时常会弹出一些无聊的广告,这对我们的影响也是极大 的,因为处于青春期的我们迷茫,好奇。但这往往会使我们掉
一个进程池的服务器程序 下面做了非常简单的http服务器,该服务器只能接收Get请求。 流程大概如下: 1,父进程listen,创建pipe(下面所有父子进程之间的通信都用该pipe) 2,父进程预fork n个子进程 3,各个子进程accept(listenfd),即所有子进程竞争accept请求。由于listenfd是在fork之前就有的,所以所有子进程都可以访问到,不需用到“进程间文件描述符传递”问题; 4,子进程每accept到一个请求都告诉父进程,父进程把请求数加1;子进程没完成一个请求,父进程把请求数减1;当父进程发现请求数 >= 子进程数时,父进程创建新的子进程,并把子进程数加1(当然子进程数有个预先上限);当父进程发现子进程数大于请求数加1时,父进程杀死多余的子进程。 总的来说,思想是让子进程accept并处理请求,父进程通过子进程发来的信息控制请求数与子进程数之间的关系。 代码如下: 代码如下: #include <time.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <sys/stat.h> #include <signal.h> #include <sys/wait.h> #include <pthread.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #define PRECHILD 5 #define MAXCHILD 50 #define BUFSIZE 4096 #define PIDPATH "pid" #define head503 "HTTP/1.1 503 Service unavailable\r\n" #define head404 "HTTP/1.1 404 Not Found\r\n" #define head200 "HTTP/1.1 200 0K\n\rContent—Type: text/html\n\rContent—Length: " int len503, len404, len200; int fd1[2], fd2[2]; typedef struct { pid_t pid; char status; // 'n' means new request; 'f' means finish the request } REPORT; void answer(int listenfd) { int connfd; char buf[BUFSIZE]; int count; int pid = getpid(); struct sockaddr_in cliaddr; int size = sizeof(cliaddr); char comm; REPORT rep; rep.pid = pid; while (1) { connfd = accept(listenfd, (struct sockaddr *)&cliaddr,(socklen_t *)&size ); //子进程accept请求 rep.status = 'n'; if (write(fd1[1], &rep, sizeof(rep)) < 0) { //通知父进程已经accept了请求 perror("write pipe new failed"); exit(-1); } count = read(connfd, buf, BUFSIZE); char req[10]; char filepath[256]; sscanf(buf, "%s%s", req, filepath + 1); filepath[0] = '.'; if (strcmp("GET", req) != 0) {//503 write(connfd, head503, len503); //goto err_out; close(connfd); exit(-1); } char content[BUFSIZE]; struct stat stbuf; if (lstat(filepath, &stbuf) != 0) { int err = errno; if (err == ENOENT) {//404 write(connfd, head404, len404); } close(connfd); exit(-1); } count = write(connfd, head200, len200); u_int filesize = stbuf.st_size; sprintf(content, "%u\n\r\n\r", filesize); count = write(connfd, content, strlen(content)); FILE *fp = fopen(filepath, "r"); if (fp == NULL) { printf("open file %s failed\n", filepath); close(connfd); exit(-1); } while((count = fread(content, 1, sizeof(content), fp)) > 0) { //printf("%s", content); if (write(connfd, content, count) != count) { printf("write failed\n"); } } fclose(fp); close(connfd); rep.status = 'f'; if (write(fd1[1], &rep, sizeof(rep)) < 0) {//告诉父进程自己处理完了请求 perror("write pipe finish failed"); exit(-1); } if (read(fd2[0], &comm, 1) < 1) {//等待来自父进程的命令 perror("read pipe failed"); exit(-1); } //printf("[%d] reve %c from pa\n", pid, comm); if (comm == 'e') { //收到exit命令 printf("[%d] exit\n", pid); exit(-1); } else if (comm == 'c') { //收到继续accept的命令 printf("[%d] continue\n", pid); } else { printf("[%d] comm : %c illeagle\n", pid, comm); } } } void usage() { printf("Usage: http-serv port\n"); } int write_pid() { int fd; if ((fd = open(PIDPATH, O_WRONLY | O_TRUNC | O_CREAT, S_IWUSR)) < 0){ perror("open pidfile faild"); return -1; } struct flock lock; lock.l_type = F_WRLCK; lock.l_start = 0; lock.l_whence = SEEK_SET; lock.l_len = 0; if (fcntl(fd, F_SETLK, &lock) == -1) { int err = errno; perror("fcntl faild"); if (err == EAGAIN) { printf("Another http-serv process is running now!\n"); } return -1; } return 0; } void daemon_init() { //clear file creation mask; umask(0); //become a session leader if (fork() != 0) exit(-1); if (setsid() < 0) exit(-1); //make sure can be never get the TTY control if (fork() != 0) exit(-1); //may chdir here int i; for (i = 0; i < 1024; i++) close(i); /* * Attach file descriptors 0, 1, and 2 to /dev/null. */ int fd0, fd1, fd2; fd0 = open("/dev/null", O_RDWR); fd1 = dup(0); fd2 = dup(0); if (fd0 != 0 || fd1 != 1 || fd2 != 2) { printf("init failed\n"); exit(-1); } } int main(int argc, char **argv) { int listenfd; struct sockaddr_in servaddr; pid_t pid; if (argc != 2) { usage(); return -1; } signal(SIGCHLD, SIG_IGN); len200 = strlen(head200); len404 = strlen(head404); len503 = strlen(head503); daemon_init(); //转为后台程序,如需打印调试,把这行注释掉 if (write_pid() < 0) //避免同时有多个该程序在运行 return -1; if (pipe(fd1) < 0) { perror("pipe failed"); exit(-1); } if (s_pipe(fd2) < 0) { perror("pipe failed"); exit(-1); } int port = atoi(argv[1]); //initialize servaddr and listenfd... bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(port); listenfd = socket(AF_INET, SOCK_STREAM, 0); bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); listen(listenfd, 1000); int i; for (i = 0; i < PRECHILD ; i++) { //父进程预fork 子进程 if ((pid = fork()) < 0) { perror("fork faild"); exit(3); } else if (pid == 0) { answer(listenfd); } else { printf("have create child %d\n", pid); } } char e = 'e'; char c = 'c'; int req_num = 0; int child_num = PRECHILD; REPORT rep; while (1) { //printf("req_num = %d, child_num = %d\n", req_num, child_num); if (read(fd1[0], &rep, sizeof(rep)) < sizeof(rep)) {//等待子进程发来消息 perror("parent read pipe failed"); exit(-1); } //printf("parent: receive from %d\n", pid); if (rep.status == 'n') {//子进程刚accept了新的请求 req_num ++; printf("parent: %d have receive new request\n", rep.pid); if (req_num >= child_num && child_num <= MAXCHILD) { //请求数过多,创建更多子进程 if ((pid = fork()) < 0) { perror("fork faild"); exit(3); } else if (pid == 0) { answer(listenfd); } else { printf("have create child %d\n", pid); child_num ++; } } } else if (rep.status == 'f') {//子进程刚处理完了一个请求 req_num --; //printf("parent: %d have finish a request\n", rep.pid); if (child_num > (req_num + 1) && child_num > PRECHILD) {//子进程数过多,删除多余的子进程 if (write(fd2[1], &e, sizeof(e)) < sizeof(e)) { perror("pa write pipe failed"); exit(-2); } //printf("tell child exit\n"); child_num --; } else { if (write(fd2[1], &c, sizeof(c)) < sizeof(c)) {//让子进程继续等待accept perror("pa write pipe failed"); exit(-2); } //printf("tell child continue\n"); } } } return 0; } 利用fork()创建多个子进程 11:09 pm on Oct 23rd 2010 greenMay 之间我学习了创建一个子进程,也大致理解了子进程与父进程的关系。今天无意间遇到一个创建多个子进程的问题,结果还发现了点小bug,现在写下来和大家分享。 我需要实现的目标如下:编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。 一开始我的主要代码如下: view source print? 01 int main() 02 { 03 pid_t child1; 04 pid_t child2; 05 child1 = fork(); 06 child2 = fork(); 07 if(child1 == 0) 08 { 09 printf("Child1:a\n"); 10 return 0; 11 } 12 if(child2 == 0) 13 { 14 printf("Child2:b\n"); 15 return 0; 16 } 17 else 18 { 19 waitpid(child1,NULL,0); 20 waitpid(child2,NULL,0); 21 printf("Parent:c\n"); 22 } 23 return 0; 24 } 奇怪的是,我得到的是这样一个结果: Child1:a Child1:a Child2:b Parent:c 竟然有两个Child1。可是我的代码里明明只是让Chidl1打印一次啊。搜索到一篇好的博文。文章仔细分析了和我几乎相同的情况。事实上,是我的粗心和对fork()的理解不深刻导致了上述的奇怪问题。 我们知道,fork()之后,我们还是首先执行的是父进程,也就是如下代码段: view source print? 1 waitpid(child1,NULL,0); 2 waitpid(child2,NULL,0); 3 printf("Parent:c\n"); 然后waitpid(child1,NULL,0),进入child1的执行。child1将要执行的是如下的的代码段: view source print? 1 child2 = fork(); 2 if(child1 == 0) 3 { 4 printf("Child1:a\n"); 5 return 0; 6 } 注意,第一行的那个child2 = fork()!这就意味着对于child1来说,它自己又要创建一个子进程,这时候他成为了父亲。这时候,它有一个儿子child2,但是这个child2不同与我们刚才定义的那个child2,这个child2其实是parent的孙子。之所以又打印了一边Child1。如果加上如下代码就明白了: view source print? 01 child2 = fork(); 02 if(child1 == 0) 03 { 04 if(child2 == 0) 05 { 06 printf("GrandChild!\n"); 07 } 08 printf("Child1:a\n"); 09 return 0; 10 } 这时候将出现: Child1:a GrandChild! Child1:a Child2:b Parent:c 恩,这就很明白了!我无意间多调用了一次child2=fork(); 所以,如果要达到我最初的目的,需要改变child2的fork()的位置: view source print? 01 #include <stdio.h> 02 #include <unistd.h> 03 #include <sys/types.h> 04 #include <sys/wait.h> 05 int main() 06 { 07 pid_t child1; 08 pid_t child2; 09 child1 = fork(); 10 child2 = fork(); 11 if(child1 == 0) 12 { 13 printf("Child1:a\n"); 14 return 0; 15 } 16 if(child2 == 0) 17 { 18 printf("Child2:b\n"); 19 return 0; 20 } 21 else 22 { 23 waitpid(child1,NULL,0); 24 waitpid(child2,NULL,0); 25 printf("Parent:c\n"); 26 } 27 return 0; 28 } 我参照的那个博文最后给出了一个更为普遍的fork()创建多进程的程序框架: view source print? 01 pid_t create_child() 02 { 03 pid_t p = fork(); 04 if( p == 0 ) 05 { 06 printf("in child %d\n", getpid()); 07 //do something 08 return 0; 09 } 10 return p; 11 } 12 int main(void) 13 { 14 pid_t p1 = create_child(); 15 pid_t p2 = create_child(); 16 17 int st1, st2; 18 waitpid( p1, &st1, 0); 19 waitpid( p2, &st2, 0); 20 printf("in parent, pid = %d\n", getpid()); 21 printf("in parent, child 1 exited with %d\n", st1); 22 printf("in parent, child 2 exited with %d\n", st2); 23 return 0; 24 } 注意到,期中的create_child()函数最后有一个return p。这个return p将pid返回给了父进程,其实也是将子进程对于CPU的控制权交还给了父进程,这样就避免了多个子进程在创建之时互相影响了。 可以说,今天的这个问题真是一个有趣的事情。代码有的时候就是这么奇怪~ 最后,向我引用的那篇文章致敬! Linux内核对多进程和多线程的支持方式: 线程机制支持并发程序设计技术,在多处理器上能真正保证并行处理。而在linux实现线程很特别,linux把所有的线程都当作进程实现。linux下线程看起来就像普通进程(只是该进程和其他进程共享资源,如地址空间)。上述机制与Microsoft windows或是Sun Solaris实现差异很大。 Linux的线程实现是在核外进行的,核内提供的是创建进程的接口do_fork()。内核提供了两个系统调用__clone()和fork(),最终都用不同的参数调用do_fork()核内API。 do_fork() 提供了很多参数,包括CLONE_VM(共享内存空间)、CLONE_FS(共享文件系统信息)、CLONE_FILES(共享文件描述符表)、CLONE_SIGHAND(共享信号句柄表)和CLONE_PID(共享进程ID,仅对核内进程,即0号进程有效)。当使用fork系统调用产生多进程时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境。当使用pthread_create()来创建线程时,则最终设置了所有这些属性来调用__clone(),而这些参数又全部传给核内的do_fork(),从而创建的”进程”拥有共享的运行环境,只有栈是独立的,由 __clone()传入。 即:Linux下不管是多线程编程还是多进程编程,最终都是用do_fork实现的多进程编程,只是进程创建时的参数不同,从而导致有不同的共享环境。Linux线程在核内是以轻量级进程的形式存在的,拥有独立的进程表项,而所有的创建、同步、删除等操作都在核外pthread库中进行。pthread 库使用一个管理线程(__pthread_manager() ,每个进程独立且唯一)来管理线程的创建和终止,为线程分配线程ID,发送线程相关的信号,而主线程pthread_create()) 的调用者则通过管道将请求信息传给管理线程。 很多朋友都说使用多线程的好处是资源占用少,其隐含之意就是说进程占用资源比线程多,对吧?但实际上Linux下多进程是否就真的点用很多资源呢?暂且不说进程是否比线程占用资源多,就进程占用资源的多少情况而言,Linux确实是做得相当节省的。产生一个多进程时肯定是要产生的一点内存是要复制进程表项,即一个task_struct结构,但这个结构本身做得相当小巧。其它对于一个进程来说必须有的数据段、代码段、堆栈段是不是全盘复制呢?对于多进程来说,代码段是肯定不用复制的,因为父进程和各子进程的代码段是相同的,数据段和堆栈段呢?也不一定,因为在Linux里广泛使用的一个技术叫copy-on-write,即写时拷贝。copy-on-write意味着什么呢?意味着资源节省,假设有一个变量x在父进程里存在,当这个父进程创建一个子进程或多个子进程时这个变量x是否复制到了子进程的内存空间呢?不会的,子进程和父进程使用同一个内存空间的变量,但当子进程或父进程要改变变量x的值时就会复制该变量,从而导致父子进程里的变量值不同。父子进程变量是互不影响的,由于父子进程地址空间是完全隔开的,变量的地址可以是完全相同的。 Linux的”线程”和”进程”实际上处于一个调度层次,共享一个进程标识符空间,这种限制使得不可能在Linux上实现完全意义上的POSIX线程机制,因此众多的Linux线程库实现尝试都只能尽可能实现POSIX的绝大部分语义,并在功能上尽可能逼近。Linux进程的创建是非常迅速的。内核设计与实现一书中甚至指出Linux创建进程的速度和其他针对线程优化的操作系统(Windows,Solaris)创建线程的速度相比,测试结果非常的好,也就是说创建速度很快。由于异步信号是内核以进程为单位分发的,而LinuxThreads的每个线程对内核来说都是一个进程,且没有实现”线程组”,因此,某些语义不符合POSIX标准,比如没有实现向进程中所有线程发送信号,README对此作了说明。LinuxThreads中的线程同步很大程度上是建立在信号基础上的,这种通过内核复杂的信号处理机制的同步方式,效率一直是个问题。LinuxThreads 的问题,特别是兼容性上的问题,严重阻碍了Linux上的跨平台应用(如Apache)采用多线程设计,从而使得Linux上的线程应用一直保持在比较低的水平。在Linux社区中,已经有很多人在为改进线程性能而努力,其中既包括用户级线程库,也包括核心级和用户级配合改进的线程库。目前最为人看好的有两个项目,一个是RedHat公司牵头研发的NPTL(Native Posix Thread Library),另一个则是IBM投资开发的NGPT(Next Generation Posix Threading),二者都是围绕完全兼容POSIX 1003.1c,同时在核内和核外做工作以而实现多对多线程模型。这两种模型都在一定程度上弥补了LinuxThreads的缺点,且都是重起炉灶全新设计的。 综上所述的结论是在Linux下编程多用多进程编程少用多线程编程。 IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。 如果是UNIX/linux环境,采用多线程没必要。 多线程比多进程性能高?误导! 应该说,多线程比多进程成本低,但性能更低。 在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。 多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。 多线程是平面交通系统,造价低,但红绿灯太多,老堵车。 我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。 高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义 1. 散沙 2010年7月10日08:43 回复 | 引用 | #1 文章很有深度,我们把握一个尺度就可以了,在windows下使用线程,unix下则使用进程就可以了 2. rjoo 2010年9月9日13:49 回复 | 引用 | #2 错的太多了,博主,应该看看新资料了。 现在都2010年了,NPTL早就取代了老的Linux thread。而且通常多线程有性能优势,但是多进程更稳定,并且通常性能瓶颈不在于是进程模型还是线程模型而在于IO。 3. rjoo 2010年9月9日13:56 回复 | 引用 | #3 关于那个critical section和pthread_mutex_t,critical section本质上是一个自旋锁,短期锁当然快,不知道你说的那个IBM的哥们怎么比的,要比也该是和pthread_spinlock_t比。 4. admin 2010年9月9日17:28 回复 | 引用 | #4 rjoo挺热心的,呵呵,这篇文章不是我写的,但有几个地方我可以解答一下: 1. Linux下没有线程的概念,pthread线程实质是通过轻量级进程实现的。你说瓶颈在IO,这一点我很赞同你的意见,作者如果能再写个IO操作的文章来的话就会更好了。 2. mutex和critical section的确是不能比的。一个涉及到内核,一个没有涉及到内核。呵呵,很佩服你对这些东西的掌握程度,有机会多交流。 ^_^ 5. 定时 2010年9月9日17:40 回复 | 引用 | #5 我们组的最近项目的经验告诉我们能用多进程不用多线程,多线程安全编程难,而且锁会早成效率很低,甚至不如单线程,你说的NPTL我知道,他只是多线程优化了并不能改变多线程安全编程的问题,锁的问题。谢谢指教,实践出真知。 @rjoo 6. 定时 2010年9月9日17:44 回复 | 引用 | #6 你说的锁,我确实不太了解,但是我们leader对它很了解,就是最近的一个项目,锁搞得他很郁闷,他也终于同意我的关键,尽可能不用多线程。 @rjoo 7. rjoo 2010年9月29日13:41 回复 | 引用 | #7 @admin Linux下没有线程的概念,pthread线程实质是通过轻量级进程实现的—这是2.4内核以前的情况(实际上是2.0时引入的,那可实在是太久了),2.4内核引入NGPL,2.6内核线程支持改为NPTL。NPTL实现的是1:1的线程模型(有资料说Win也是这种实现,虽然不太确定,但我觉得可能性很大),而NGPT虽然是理论上最先进的m:n线程模型,但最后实现出来的性能差NPTL一大截,最后被抛弃。看看文中说法就知道要么文章写的很早,要么作者看了一堆十年前的资料。 给个链接: http://www.kegel.com/c10k.html#threads.linuxthreads 8. finalday 2010年10月15日17:26 回复 | 引用 | #8 忍不住跳出来说,作者对并发编程的理解还不行。 比如说锁的问题,说得好像是多线程才需要的东西一样。如果一个应用多进程时完全不用锁,多线程也就多一个轻量级锁——锁一下,各回各家,每个线程用自己的专有存储,之后不就和多进程一样了?这样会被搞得很郁闷?当然不会。所以说明那个应用对于数据共享的需求不是这么简单,既然不是这么简单,多进程程序一样要加锁。多进程的加解锁代价可比多线程大得多了,共享数据和协作也麻烦多了。 多线程编程难不难?难,但这是由于并发本身的难度引起的。“锁”,“安全编程”不管是多线程还是多进程都一样会遇到。 多线程的最大优点是数据共享和协作方便。 多进程的最大优点是挂了一个进程不会影响其他进程,资源也不会泄露,故比较能容忍程序员犯错。 至于两者裸奔比性能,真的没啥意义。
大数据杀熟是什么   大数据杀熟是指同样的商品或服务,老客户看到的价格反而比新客户 要贵出许多的现象。2018 年 3 月,"大数据杀熟"这个词进入大家视野,不过 这一现象或已持续多年。有数据显示,国外一些网站早就有之,而近日有媒 体对 2008 名受访者进行的一项调查显示,51.3%的受访者遇到过互联网企业 利用大数据"杀熟"的情况。   与其称这种现象为"杀熟",不若说是"杀对价格不敏感的人":一罐可 乐,在超市只卖 2 元,在五星级酒店能卖 30 元。这不能叫价格歧视,而是因 为人们能住得起五星级酒店,那幺就是要被"杀",这个理论套用在"大数据杀 熟"上却并不恰当。一个关键问题是,一罐可乐的正常价格是透明的,所以在 五星级酒店的溢价是公开的。但"大数据杀熟"却处于隐蔽状态,多数消费者 是在不知情的情况下"被溢价"了。此外,将老顾客等同于"对价格不敏感的 人",也有偷换概念之嫌。   举个例子,如果在你想买口红的时候,碰巧你的网页给你推了很多卖 口红的广告,那幺你点这个广告的可能性是不是很大,同时你点进去之后消 费的可能性是不是也很大。大数据就是能造成这种"碰巧"的工具。它能通过 你的浏览记录综合分析出你现在需要的东西并把相关链接推送给你。那幺大 数据在里面扮演的什幺角色呢?   比如:大数据分析出你是一名公司领导,对企业税收方面比较关注, 那幺就会大量给你推送关于川普承诺上任后为企业减少所得税的消息;比如 你是一名金融从业者,那幺就会给你推送大量关于川普上任后将放松金融监 管的消息……民众或许不了解川普,但是很多人喜爱川普的政见,而这些让 民众爱上川普的消息都是经过大数据分析后根据喜好推送给你的。做的好 了,它能像京东自建库那样帮助物流做到"当日达",来汇集普通民众。   或者未来当我们钢铁行业也有大数据分析后,还可以做资源需求预测 分析来指导钢厂生产或者钢贸商销售策略制定。但是它同样可以像之前爆出 的"某些大型互联网公司利用大数据杀熟":同一种产品,同一个时间,老用 户看到的价格比新用户价格贵;或者同一家外卖,家附近没有商场的用户比 交通便利的客户贵,用苹果手机的用户看到的商品价格比用安卓机的人贵 (这个歧视太严重了)等等。   通俗地讲,大数据就是全世界几十亿人使用计算机、平板电脑、手机 和其它数字设备产生海量数据,这个量,已经到了人类无法处理只能通过机 器处理的阶段了。大数据技术的战略意义不在于掌握庞大的数据信息,而在 于对这些含有意义的数据进行专业化处理。在大数据时代,数据已经成为一 种商业资本,通过一定的逻辑处理,就可以创造新的经济利益。   现如今,只要你联入互联网,那幺你的隐私就不复存在。日常使用的 大部分软件,都或多或少通过你的点击或搜索来收集你的隐私信息。在这期 间,软件会上传你的数据信息,通过机器高速处理,挖掘出有用的信息,建 立用户画像。
用户体验(User Experience,简称UE/UX)是一种纯主观在用户使用产品过程中建立起来的感受, 以用户为中心、以人为本越来越得到重视. 用户体验,即用户在使用一个产品或系统之前、使用期间和使用之后的全部感受,包括 情感、信仰、喜好、认知印象、生理和心理反应、行为和成就等各个方面。   随着产品同质化时代的到来,用户体验已成为企业的核心竞争力之一。美国著名推 销员拉德有个闻名的250法则,他认为每一位顾客身后,大约有250名亲朋好友。如果赢 得了一位顾客的好感,就意味着赢得了250个人的好感;反之,如果得罪了一名顾客,也 就意味着得罪了250名顾客。   因此从一定程度上说,用户体验的完美,就是竞争的胜利。善待每一位用户,企业 就点亮了一盏吸引更多用户的明灯,而创造每一位用户的完美体验,企业就将达到"登峰 造极"。 1、感观体验:呈现给用户视听上的体验,强调舒适性。一般在色彩、声音、图像、 文字内容、网站布局等呈现。 2、交互用户体验:交流过程的体验,强调互动、交互特性 3、情感用户体验:给用户心理上的体验,强调心理认可度。让用户通过站点能认同、抒 发自己的内在情感,那说明用户体验效果较深。情感体验的升华是口碑的传播,形成一 种高度的情感认可效应。 用户是水,得用户心者得天下。 在餐饮业,创意设计从来就不是术,而是遵循用户体验之道。 用户体验的设计,靠的不是聪明才智,靠的是走心。 举一个例子海底捞,真正吸引很多人去,是因为给大家提供的食材都是金枝玉叶吗?不是 ,海底捞吃的东西跟其他饭馆差不多,为什么大家去海底捞?服务好。这个服务好好在哪 里?只不过做了一些同行没有做的事情,给你擦眼镜,给你擦鞋,饭前免费磕瓜子,饭后 免费吃西瓜,能举出很多例子 海底捞胜在流程 绝妙用户体验让你宾至如归 微博上曾流传一句话,地球人已经无法阻止海底捞!   海底捞的服务之所以让消费者印象深刻,不仅仅是体现于某一个细小的环节上。海 底捞还设计了一套从顾客进门到就餐结束离开的完整服务体系,几乎涵盖了就餐过程中 所有的用户体验环节,将其他餐馆中存在的许多问题通过服务的形式予以了很好的解决 。    1让等待充满快乐。就餐排队是顾客最讨厌的,传统的等待只是在餐馆的椅子上干 等着,海底捞却反其道而行之。当你在海底捞等待区等待的时候,热心的服务人员会立 即为你送上西瓜、橙子、苹果、花生、炸虾片等各式小吃,还有豆浆、柠檬水、薄荷水 等饮料,甚至还提供美甲和擦皮鞋的服务。排队等位也成为了海底捞的特色和招牌之一 。    2节约当道的点菜服务。如果客人点的量已经超过了可食用量,服务员会及时提醒 客人,服务员还会主动提醒食客,各式食材都可以点半份。 3及时到位的席间服务。主动为客人更换热毛巾,给长头发的女士提供橡皮筋箍头、 提供小发夹夹刘海,给带手机的朋友提供小塑料袋子装手机以防进水,免费送擦镜布, 给每位进餐者提供围裙。 当N公司面临苹果公司挑战的时候,N公司做了很宏大的规划,花了60多亿美金买了一 家做地图的公司,买了互联网的公司,很宏伟的格局。到今天他们跟微软公司合作,也 有很宏伟的格局。我一直用N公司的产品,但我认为N公司从来没有从用户的角度,从产 品的角度去想一想。现在用户用这些手机的时候,到底遇到了什么困难的地方。他们高 管我认为也不用苹果公司的手机,所以他们不知道苹果手机到底为什么赢得了用户的喜 爱。 你真的觉得苹果公司成功是因为在宏观战略上规划得好?我不谈战略,我也不懂战略 。我认为苹果公司也没有战略。如果有说有战略的话,所有战略都是用户战略和产品战 略,不断发现用户的需求,不断满足用户需求,把它做到极致。 消费者是不理性的,消费者选择一个产品,抛弃一个产品,不是因为你有好的技术, 或者不好的技术,用户都是从点点滴滴中感受。为什么我讲微创新?我说的微,对于消 费者来说,感觉都是微小的点。消费者之所以用你的产品,可能就因为那一个很小的点 。消费者不理智,是特别感性的。今天的消费者比以前更感性,产品最后不是拼功能, 拼技术,而是拼体验。苹果公司没有手机通讯的核心专利,有的都是外观专利。什么CD MA,什么芯片之类,都没有。但是苹果公司席卷了整个无线互联网终端,以往的大公司 被打得落花流水。如果说互联网是一场革命的话,对于企业意味着什么?从我的角度来 看,这就是互联网消费者拥有更多的知情权和选择权,互联网让信息更加对称。在信息 不对称的年代,买的没有卖的精,无商不奸,企业通过广告,通过宣传,利用信息不对 称向消费者灌输信息,在这种情况下消费者买你的东西。一旦钱到手了,企业的营销任 务就完成了,就跟消费者说拜拜了。最后的售后服务是不得不做的一个环节。 什么是好的用户体验的例子: 第一,首先要超出用户预期,能够给用户带来惊喜。 《商业秀》里面提到这样一
风险投资人看人的十种偏见PPT作品,共23页; PPT以黑色为背景色,设计简洁明了。告诉创业者,在寻求风险投资之前,你要克服以下10个缺点。 据说,风险投资人经常对创业者有以下10种偏见,如果创业者有超过两种细节让其不满意,不管产品、市场多好,风险投资人肯定不会投资给他。 1、时间 经常迟到,或者屡次修改会见时间的创业者,风险投资人肯定不喜欢。连自己的时间都管不好,又怎么来管公司? 2、年龄 一般来说,已经秃顶,或者白发斑斑的创业者,尤其是第一次创业的60后,风险投资人基本上不会投的,他们最喜欢的创业者年龄是30—35岁。 3、速度 在风险投资人眼里,首先,创业者以前必须挣过大钱,要不连启动资金都没有,凭什么相信你能赚钱?其次,公司成立时间不能过长,公司就像女人,越早结婚越合适。 4、身份 富二代和官二代,绝对不是风险投资人的首选对象,投资人虽然愿意跟创业者一起承担风险,但绝不愿意承担你只是为了证明自己长大了的风险。 5、海龟 在风险投资人看来,如果没有2年以上的本土锻炼,年轻海龟经常什么都不懂,缺乏对用户的理解;而年老的海龟,则往往对社会有心态扭曲。 6、搭配 创始人之间搭配不好,争抢着出风头,动不动就互相批评的公司,风险投资人肯定不会投,你让他们怎么相信这样的团队可以长久? 7、心态 跟风险投资人说话时脸红、手抖加结巴,他们怎么放心把几千万交给你?喜欢说脏话可以,怯场绝对是大忌。 8、PPT 风险投资人认为,PPT代表着公司的形象,PPT没重点,只能说明创业者逻辑混乱,PPT都做得脏乱差,怎么能把产品做好? 9、性格 在风险投资人看来,不爱说话,不爱发邮件,微信、微博通通都不爱的人,肯定做不好销售。要是真投了这样的创业者,以后估计得郁闷死。 10、数据 在风险投资人的思维中,公司成立初期,CEO必须是最核心的产品、运营和销售负责人,必须清楚每一个数据和逻辑,如果遇到提问,一问三不知,投资人只会说:哥们儿,你确定你是来创业的吗? 其实,上述观点都是本人观点。今天就聊到这里吧,谢谢!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为互联网铺一条公路

你的支持,我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值