精华内容
下载资源
问答
  • 如取“Consumer”,意为消费du、个人用户或终端用zhi户,使用是客户端。例如:网易新闻、dao网易云音乐等等。 C,面对面对个人用户,多为单个个体使用,讲究用户使用感觉,有一个核心功能,其他功能都...

    “C端”简介

    C有释义为bai:Consumer、Client;如取“Consumer”,意为消费du者、个人用户或终端用zhi户,使用的是客户端。例如:网易新闻、dao网易云音乐等等。

    C端,面对面对个人用户,多为单个个体使用,讲究用户的使用感觉,有一个核心的功能,其他的功能都是附加的,是为“碎片化的时间”服务的,特点是数据量大,因为用户群大,数据增长都是指数级的。

    “B端”简介

    B释义为:Business;通常为企业或商家为工作或商业目的而使用的系统型软件、工具或平台。例如:网易云、网易有数或企业内部的ERP系统等等。

    B端,面对企业客户,多为一个群体使用,本质是满足工作需求,多为多种功能的整合,讲究协同合作。使用B端往往是长时间、沉浸式,B端是服务于公司或企业所有员工

    C端&B端产品的本质及特性:

    在这里插入图片描述

    扩展资料:

    C端产品的本质基本都是一个核心功能,例如:音乐类app的核心功能就是听音乐;阅读类app的核心功能就是阅读;游戏类app的核心功能就是游戏。

    C端产品的特性可以总结为一个词——“分享”例如“评论”、“打赏”其实都基于“分享”,即让他人听见“我”的声音,看见“我”的想法。

    B端产品的本质则是满足用户的工作需要,而工作需要从来不是单一的功能就可以满足的,其必然包括多项功能的复合及嵌套应用支持。

    B端产品的特性也非常明确——即“协同工作”。在处于信息时代的现代公司或企业中,几乎已没有可以单独完成而不需要协同合作的工作。

    展开全文
  • 前言:编写多进程程序时,有时不可避免需要在多个进程之间传递数据,我们知道,进程用户地址空间是独立,父进程对数据修改并不会反映到子进程,但内核是共享,大多数进程间通信方式都是在内核建立一...

    前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一块存储区域,用来实现进程间的通信(也可以将数据写进文件,通过文件操作,但文件操作的开销会比较大)。

    一.管道通信方式:管道通信具有单向,无结构,先进先出的字节流特点;管道有2个端点,一个端点写入数据,一个端点读取数据,当数据从管道中读出时,这些数据将被移走。当进程从空管道中读取数据或向已满的管道写入数据时,进程将被挂起,直到有进程向管道中写入数据或从管道中读取数据,此时,进程将由等待状态变为就绪状态。对管道的操作和对文件的操作差不多。根据管道提供的应用接口的不同,管道可分为命名管道和无名管道。

    1.无名管道

    #include <unistd.h>

    int pipe(int fd[2])        

     // 创建一个无名管道fd包含2个文件描述符的数组,fd[0]用于读,fd[1]用于写若成功返回0,否则反回-1

    一般某个进程用于读,另一个进程用于写,用于读的进程需要close(fd[1]),用于写的进程需要close(fd[0]);

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    int main(void)
    {
        pid_t pid;
        int fd[2],i,n;
        char chr;
        pipe(fd);
        pid=fork();
        if(pid==0)          //子进程
        {
            close(fd[1]);
            for(i=0;i<10;i++)
            {
                read(fd[0],&chr,1);
                printf("%c\n",chr);
            }
            close(fd[0]);
            exit(0);
        }
        close(fd[0]);           //父进程
        for(i=0;i<10;i++)
        {
            chr='a'+i;
            write(fd[1],&chr,1);
            sleep(1);
        }
        close(fd[1]);
        return 0;
    }

    若只想读取某个进程的结果,或写入某个进程的输入可以使用popen函数,popen函数首先调用pipe创建管道,然后调用fork函数创建子进程,在子进程中调用execve函数

    执行相关命令。

    #include <stdio.h>

    FILE *popen(const char *command,const char *type)

     //  command执行的shell命令,type命令的输入输出类型(r:打开命令执行的标准输出w:打开命令执行的标准输入),成功返回文件I/O流否则返回NULL

    int pclose(FILE* stream)       //返回命令执行的返回状态

    #include <stdio.h>
    int main()
    {
        FILE *fp;
        fp=popen("/bin/ls -a","r");
        char buf[256];
        int line=1;
        while(fgets(buf,256,fp)!=NULL)
        {
            printf("%d: %s",line++,buf);
        }
        pclose(fp);
        return 0;
    }

    命名管道

    命名管道作为一个特殊的文件保存在文件系统中,任意一个进程都可以对命名管道进行读写,只要进程具有相应的读写权限

    #include <sys/types.h>

    #include <sys/stat.h>

    int mkfifo(const char *pathname,mode_t mode);

    //创建命名管道 pathname文件路径名,mode存取权限,若成功返回0,否则返回-1

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        mkfifo("fifo",0660);   //创建一个命令管道,属主和用户组具有读写权限
        pid_t pid;
        pid=fork();
        if(pid==0)
        {
            char buf[256];
            int fd=open("fifo",O_RDONLY);   //子进程读管道中的数据
            read(fd,buf,10);
            buf[10]=0;
            printf("%s",buf);
            close(fd);
            exit(0);
        }
        int fd=open("fifo",O_WRONLY);    //父进程向管道写入数据
        write(fd,"fifo test\n",10);
        close(fd);
        return 0;
    }

     IPC(进程间通信):IPC的内容包括信号量,消息队列和共享内存,即一个IPC对象可以是一个信号量也可以是一个消息队列也可以是一个共享内存。每一个IPC对象都有一个正整数标识,与文件描述符不同的是ipc对象的标识是全局的,用于识别整个系统中不同的ipc对象。ipc对象的标识由进程运行时决定,不是每次都相同。因此进程为了通信,不仅要知道使用的IPC对象类型,而且也需要知道ipc对象标识。但是进程在执行前并不知道IPC对象标识,下面给出2种办法

    (1)创建IPC对象时,key使用IPC_PRIVATE,这样就保证返回一个新的IPC对象,然后将这一标识存放于某个文件中,其他进程便可打开文件获得该IPC对象标识

    (2)创建某一个IPC对象时,key值随机使用一个数字,在不同的进程中,对于创建IPC对象的进程,根据key值得到一个IPC对象标识,对于获取IPC对象的进程,使用相同的key值就可以得到与该key值相对应的IPC对象的标识

    下面一段代码说明了key值的作用

    #include <stdio.h>  
    #include <sys/ipc.h>  
    #include <sys/sem.h> 
    #include <sys/types.h>  
    #define MY_SEM_ID 120
    int main ( int argc, char *argv[] )
    {      
    
        int semid;
        semid=semget(MY_SEM_ID,1,0666|IPC_CREAT);//如果把MY_SEM_ID换成IPC_PRIVATE那么每次程序的执行
        printf("semid=%d",semid);                //结果都不相同,若是MY_SEM_ID,则结果相同即使在不同的
        return 0;                                //进程中,即只要key相同,则返回的标识就相同
        
    } 

    IPC相关API

    信号量(用与多进程程序在存取共享资源时的同步控制)

    #include <sys/types.h>

    #include <sys/ipc.h>

    #include <sys/sem.h>

    int semget(key_t key,int nsems,int semflg)

     函数说明:功能:获得或创建信号量,key:根据key生成信号量标识,nsems:创建的信号量集中的信号量的个数,该参数只在创建信号量集时有效。,semflg:存取权限或创建条件若为0则用于获得已存在的信号量若为IPC_CREAT|perm perm为存取权限,则用于创建信号量,成功返回信号量标识,出错返回-1

     

    int semop(int semid,struct sembuf* sops,unsigned nsops)

    函数说明:功能:获得或者释放信号量,semid:信号量标识,sops指向由sembuf组成的数组,nsops信号量的个数,成功返回0,否则返回-1

    struct sembuf{

    ushort sem_num;   //在信号量数组中的索引

    short sem_op;       //要执行的操作,若sem_op大于0那么操作为将sem_op加入到信号量的值中,并唤醒等待信号增加的进程;若sem_op等于0,当信号量的值也是0时, 函数返回,否则阻塞直到信号量的值为0;若sem_op小于0,则判断信号量的值加上sem_op的值,如果结果为0,唤醒等待信号量为0的进程,如果小于0,调用该函数的进程阻塞,如果大于0,那么从信号量里减去这个值并返回。

    short sem_flg;         //操作标致SEM_UNDO会阻塞,IPC_NOWAIT不会阻塞

    };

     

    int semctl(int semid,int semnum,int cmd,union semun arg);

    函数说明:功能:在信号量集上的控制操作,semid信号量集的标识,semnum信号量集的第几个信号量,撤销信号量集时,次参数可缺省,cmd用于指定操作类别,值为GETVAL获得信号量的值,SETVAL设置信号量的值,GETPID获得最后一次操作信号量的进程,GETNCNT获得正在等待信号量的进程数,GETZCNT获得等待信号量值变为0的进程数,IPC_RMID 删除信号量或信号量数组

     

    共享内存

    共享内存是内核中的一块存储空间,这块内存被映射至多个进程的虚拟地址空间。共享内存在不同进程虚拟地址空间中映射地址未必相同。

    相关API

    #include <sys/ipc.h>

     #include <sys/shm.h>

    int shmget(key_t key,int size,int shmflg)

    函数说明:功能:创建或获得共享内存,key:作用同上,size:共享内存的大小,shmflg:存取权限或创建条件,若为IPC_CREAT|perm perm为存取权限,则表示创建共享内存,为0表示获得共享内存

     

    void * shmat(int shmid,const void *shmaddr,int shmflg)

    函数说明:功能:将创建的共享内存映射到进程虚拟地址空间的某个位置,shmid:共享内存标识,shmaddr要映射到的进程虚拟空间地址,若为NULL,则由系统决定对应的地址,shmflg:指定如何使用共享内存,若指定了SHM_RDONLY位则表示以只读的方式使用此段,否则以读写的方式使用此段.成功返回映射的地址失败返回-1

     

    int shmdt(const void* shmaddr);

    函数说明:解除共享内存的映射,shmaddr:共享内存的映射地址,成功返回0,否则返回-1

     

    int shmctl(int shmid,int cmd,struct shmid_ds *buf)

    函数说明:对以存在的共享内存进行操作,shmid:共享内存标识,cmd:操作类型:cmd 为IPC_STAT 获取共享内存的状态,IPC_/SET设置共享内存的权限,IPC_RMID删除共享内存,IPC_LOCK 锁定共享内存,使共享内存不被置换出去,IPC_UNLOCK解锁

     

        struct shmid_ds{

        struct ipc_perm   shm_perm;   //存取权限

        int        shm_segsz; //共享内存大小

        __kernel_time_t       shm_atime;  //最后映射时间

          __kernel_time_t       shm_dtime;  //最后解除映射时间

        __kernel_time_t       shm_ctime;  //最后修改时间

        __kernel_ipc_pid_t  shm_cpid;    //创建进程ID

        __kernel_ipc_pid_t  shm_lpid;    //最近操作进程ID

        unsigned short         shm_nattch; //建立映射的进程数

        }

     

    下面是一个经典的生产者消费者代码实例   

    //semshm.h 封装了创建信号量删除信号量,P操作,V操作
    #ifndef SEMSHM_H
    #define SEMSHM_H #define SHM_KEY 9494 #define SEM_KEY_1 9399 #define SEM_KEY_2 9595 #define BUF_SIZE 1024 #include <string.h> union semnum { int val; struct semid_ds *buf; unsigned short *array; }; int sem_create(key_t key,int val) //创建一个信号量并置处值为val { int semid; semid=semget(key,1,0666|IPC_CREAT); if(semid==-1) { perror("semget"); exit(-1); } union semnum arg; //联合类型的变量初始化必须用{},赋值使用 arg.val=0 arg.val=val; //设信号量的初始值 if(semctl(semid,0,SETVAL,arg)==-1) { perror("semctl"); exit(-1); } return semid; } void sem_del(int semid) //删除信号量 { union semnum arg; arg.val=0; if(semctl(semid,0,IPC_RMID,arg)==-1) { perror("semctl"); exit(-1); } } int P(int semid) //P操作,使信号量的值减1 { struct sembuf sops={0,-1,SEM_UNDO};//第三个参数设置为SEM_UNDO时当信号量小于0时会阻塞,设置为IPC_NOWAIT则不会阻塞 return (semop(semid,&sops,1)); } int V(int semid) //V操作,使信号量的值加一 { struct sembuf sops={0,+1,SEM_UNDO}; return (semop(semid,&sops,1)); } struct msg_data //定义一个共享内存存储的消息结构体 { char data[BUF_SIZE]; }; void Productor(struct msg_data *msg,int i) //生产者 { const char * str="productid:"; char *array[]={"1","2","3","4","5"}; strcpy(msg->data,str); strcat(msg->data,array[i]); printf("Productor:%s\n",msg->data); } void Customer(struct msg_data *msg) //消费者 { printf("Customer:%s\n",msg->data); } #endif
    //allsemshm.c   创建了2个信号量用于实现生产者和消费者之间的同步问题 ,并创建了一个共享内存作为共享资源
    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include "semshm.h" int main() { int empty,full,shmid; empty=sem_create(SEM_KEY_1,1);//设置一个信号量置初值为1 full=sem_create(SEM_KEY_2,0); //设置一个信号量置初值为0 shmid=shmget(SHM_KEY,sizeof(struct msg_data),0666|IPC_CREAT); if(shmid==-1) { perror("shmget"); exit(-1); } printf("empty=%d\tfull=%d\tshmid=%d\n",empty,full,shmid); return 0; }
    //semshm_s.c  生产者代码
    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include "semshm.h" int main() { int empty,full,shmid; empty=semget(SEM_KEY_1,1,0); //获得信号量 full=semget(SEM_KEY_2,1,0); shmid=shmget(SHM_KEY,0,0); //获得共享内存 if(empty==-1||full==-1||shmid==-1) { perror("get"); exit(-1); } struct msg_data *buf; void * tmp=shmat(shmid,NULL,0); //映射共享内存 buf=(struct msg_data*)tmp; int i=0; for(i=0;i<5;i++) { sleep(15); P(empty); Productor(buf,i);    //生产者向共享内存写入数据 V(full); } return 0; }
    //semshm_c.c  消费者代码 
    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include "semshm.h" int main() { int empty,full,shmid; empty=semget(SEM_KEY_1,1,0); //获取信号量 full=semget(SEM_KEY_2,1,0); shmid=shmget(SHM_KEY,0,0); //获取共享内粗 if(empty==-1||full==-1||shmid==-1) { perror("get"); exit(-1); } struct msg_data *buf; buf=(struct msg_data*)shmat(shmid,NULL,0); //映射共享内存地址 int i=0; for(i=0;i<5;i++) { P(full); Customer(buf); //消费者从共享内存取数据 V(empty); } return 0; }

     

    //delsemshm.c  //删除所建的信号量和共享内存    
    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include "semshm.h" int main() { int empty,full,shmid; empty=semget(SEM_KEY_1,1,0); full=semget(SEM_KEY_2,1,0); shmid=shmget(SHM_KEY,0,0); if(empty==-1||full==-1||shmid==-1) { perror("del get"); exit(-1); } sem_del(empty); sem_del(full); struct shmid_ds *ds=(struct shmid_ds*)malloc(sizeof(struct shmid_ds)); shmctl(shmid,IPC_RMID,ds); printf("del success !\n"); return 0; }

    运行:我们先运行allsemshm这个程序,建立信号量和共享内存,再运行semshm_s这个生产者程序(会sleep15秒),同时,运行2个semshm_c消费者程序,观察程序的输出,再调用delsemshm程序删除信号量和共享内存

    运行截图

    分析这段代码,首先创建了empty和full2个信号量用来实现进程同步问题(这个生产者消费者只有一个缓冲去可以不考虑互斥问题,对于多个缓冲区的生产者消费者问题需要使用3个信号量完成同步和互斥操作),并创建了一个共享内存做为共享资源,接着生产者会生产5次,只有缓冲区内容被取走时才能进行生产操作,同时开启了2个消费者程序。只有缓冲区有内容时,消费者才能执行他的动作。对于生产者消费者问题的信号量操作可以参考操作系统教程中相关内容。

    消息队列

    消息队列是存在于内核中的消息列表,一个进程可以将消息发送到消息列表。另一个进程可以从消息列表接受消息。消息队列的操作方式为先进先出

    相关API

    #include <sys/types.h>

    #include <sys/ipc.h>

    #include <sys/msg.h>

    int msgget(key_t key,int msgflg)

    函数说明:功能:获取或者创建一个消息队列,key值同上,msgflg:存取或者创建条件值同上。成功返回消息队列标识,失败返回-1.

    int msgsnd(int msgid,const void* msgp,size_t msgsz,int msgflg)

    函数说明:功能:向消息队列中发送消息,msgid:消息队列标识,msgp消息结构体的地址,msgsz:消息结构体的字节,msgflg:操作标志,成功返回0,否则返回-1。在消息队列没有足够的空间容纳发送的消息时,该函数会阻塞,如果msgflg为IPC_NOWAIT ,则不管发送消息是否成功,该函数都不会阻塞。其中msgp必须指向这样一个结构体

    struct msgbuf{

    long mtype;   //必须有且大于0

    char mtext[1];  //这个可以自己定以,也可以定义其他成员

    }

    size_t msgrcv(int msgid,void *msgp,size_t msgsz,long msgtyp,int msgflg)

    函数说明:获取指定消息队列中,msgtyp类型的消息,该值要根发送消息的结构体中msgp->mtype值一样,msgsz,消息结构体的大小,msgflg操作标志,值同上

    成功返回收到的字节个数,失败返回-1

    int msgctl(int msqid,int cmd,struct msqid_ds* buf)

    函数说明:cmd操作类型,IPC_RMID删除消息队列,IPC_STAT获取消息队列的状态,IPC_SET改变消息队列的状态,buf用来存放消息队列的属性信息,其结构体如下

    struct msqid_ms{

    struct ipc_perm msg_perm;   //权限

    struct msg *msg_first;   //消息队列的首

    struct msg *msg_last;     //消息队列的尾

    __kernel_time_t msg_stime;   //最后发送时间

    __kernel_time_t msg_rtime;  //最后接受时间

    __kernel_time_t msg_ctime; //最后修改时间

    unsigned short msg_cbytes;    //当前消息队列的字节数

    unsigned short msg_qnum;  //消息队列中的消息数

    unsigned short msg_qbytes; //消息队列的最大字节数

    __kernel_ipc_pid_t  msg_lspid; //最后发送消息的进程ID

    __kernel_ipc_pid_t  msg_lrpid; //最后接受消息的进程ID

    };

    演示代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <unistd.h>
    #define MSG_KEY 111
    #define BUFSIZE 4096
    struct msgbuf
    {
        long mtype;
        char mtext[BUFSIZE];
    };
    int main()
    {
        int mspid;
        pid_t pid;
    
        mspid=msgget(MSG_KEY,IPC_CREAT|0666);
        if(mspid==-1)
        {
            perror("msgget");
            exit(-1);
        }
    
        pid=fork();
        if(pid<0)
        {
            perror("fork");
            exit(-1);
        }
        else if(pid==0)
        {
            sleep(10);
            int msqid=msgget(MSG_KEY,0);
            if(msqid==-1)
            {
                perror("msgget");
                exit(-1);
            }
            struct msgbuf buf;
            if(msgrcv(msqid,(void *)&buf,sizeof(struct msgbuf),1,0)==-1)
            {
                perror("msgrcv");
                exit(-1);
            }
            printf("child:rcv a msg is %s\n",buf.mtext);
            exit(0);
        }
        else
        {
            struct msgbuf buf;
            buf.mtype=1;
            strcpy(buf.mtext,"Hello World!");
            if(msgsnd(mspid,(const void *)&buf,sizeof(struct msgbuf),0)==-1)
            {
                perror("msgsnd");
                exit(-1);
            }
            printf("parent:snd a msg is %s\n",buf.mtext);
            sleep(10);
        }
    
       // struct msqid_ds cbuf;
        msgctl(mspid,IPC_RMID,NULL);
        return 0;
    }

    总结:以上就是一些常用的进程通信的方法了,关于一些具体的API和一些结构体,以及宏所代表的意义,如果不是很清楚可以在Linux下man相关函数,Linux多进程编程就到这里了,接下来就是多线程编程相关的知识了。

    转载于:https://www.cnblogs.com/CodingUniversal/p/7400219.html

    展开全文
  • C产品也叫2C(to Customer)产品,是面向终端用户或消费者的产品,往往承担引流和转化的任务;C产品是企业与消费者之间的重要媒介,也是企业重要的获客手段之一。 C的产品一般有如下特点: 用户即个体。用户...

    什么是C端产品

    C端产品也叫2C(to Customer)产品,是面向终端用户或消费者的产品,往往承担引流和转化的任务;C端产品是企业与消费者之间的重要媒介,也是企业重要的获客手段之一。

    C端的产品一般有如下特点:

    用户即个体。用户就是独立的个人,而不是一个组织或机构;
    强调用户体验。因为C端产品的重要任务是引流和转化,在产品初期,优秀的用户体验会在用户群中形成口碑营销,方便获客。所以C端产品在产品设计上对细节处理有比较高的要求,强调情感化设计。
    运营占据至关重要的位置。对于C端产品来说,产品功能固然非常重要,但是如果没有卓越的运营手法,很可能会走向失败。运营的工作包括了内容建设、营销推广、用户关怀等,如果一个不错的产品加上优秀的运营,那就很可能成功。
    数据驱动设计。C端产品对用户转化率看得极其重要,在转化路径上增加监控,对于每一个按钮,输入框或者配色对进行极致的优化,追求更高的转化率。
    C端产品按照运行设备分为:

    PC端产品:包括Web网站,PC软件。
    移动端产品:包括手机、移动设备上的原生APP和H5应用。
    其他设备端产品:比如嵌入式软件,智能硬件等。
    C端产品按照所实现的功能可分为:

    工具类产品:为用户解决某个具体需求。
    内容类产品:为原创或聚合内容提供分享平台。
    社交类产品:为用户解决沟通交友需求。
    平台类产品:作为双边市场平台服务方,帮助买卖双方实现交易撮合。
    互联网的出现,对传统企业的最大贡献之一就是增加了销售渠道和获客来源。通过在C端产品聚集大量用户,然后加以商业推广,进而达成交易,大大减少传统企业的地推成本和销售人力。

    所以,C端产品更注重转化率,C端的产品经理就要“变着法子哄用户”,促使用户转化消费,这也要求C端产品经理要非常了解目标用户的需求和消费心理。

    什么是B端产品
    B端产品也叫“2B(Bussiness)”产品,使用对象是组织或企业。B端产品往往是基于某个业务领域,解决客户在办公或经营过程中遇到的问题,为客户提高效率、增加收入、减少成本,一句话概括就是“为客户赚的更多,省的更多”。

    B端产品的目标
    B端的产品一般有如下特点:

    目标用户是群体。B端用户通常是企业或者组织,B端产品里面的功能涉及到多个角色参与,需要多人协作完成。
    效能第一、体验第二。不同于C端产品,B端产品往往注重效率,重视功能的可用性,产品是否能够解决他们的问题是最重要的,体验在效率面前就显得没那么重要了,只是个加分项。
    强调抽象和逻辑。B端产品可能包含一整个业务线的运转,人员、分工、协作、流程和规则随时都可能发生变化,这就需要B端产品经理需要较强的逻辑能力和抽象能力,如何把客户的问题,抽象成一个行业通用的功能,适用于大部分同行的业务操作流程,是B端产品经理经理遇到的问题。
    产品的优劣难以量化。比如,一款跨境电商卖家工具,帮助管理广告投放。广告投放的最重要指标是转化,影响转化的因素很多,广告关键词、产品品质、季节、政策等,即使这款工具能帮你找出很好的广告关键词,但是由于其他因素的影响,你的广告转化率可能仍然很差。
    其实,在商品销售过程中,有很多因素会影响产品销量,B端产品只能承担一部分优化的工作,并不是百分百的担保。商业不是冷冰冰的机器和规则,市场时刻在变,产品需要不断的调整自己以适应市场。

    B端与C端产品功能的区别

    B端产品的部署方式分为:

    私有化部署:就是说软件服务公司上门安装,把他们的软件安装在客户公司特定的主机上运行。这种安装特点是比较安全、网速快;缺点是:软件维护困难,成本较大。
    云部署:指把软件部署在云服务器,客户通过公共Web软件体验服务。这种安装特点是方便、简洁、容易维护、成本较低。缺点是:安全性较低,可能出现网络堵塞。
    B端产品的技术架构可分为:

    B/S架构:即Browser/Server,浏览器/服务器模式,用户通过自己电脑上的浏览器访问系统体验服务。目前市面上大部分B端产品都是这种架构方式。
    C/S架构:即Customer/Server,客户端/服务器模式,这是早期PC软件经常使用的架构方式,用户需要安装客户端才能体验服务,客户端还要经常更新,非常繁琐。
    B端产品按业务方向可分为:

    业务支撑类产品:支持企业经营管理或核心业务的开支,比如仓配系统和CRM。
    办公协同产品:支持企业内部办公协同,比如OA系统、HRM系统。

    OA系统常见功能

    CRM系统常见功能
    有些同学会有疑问:那SaaS产品又是啥?

    SaaS产品
    SaaS是Software-as-a-Service的缩写名称,意思为软件即服务,即通过网络提供软件服务。
    SaaS平台供应商将应用软件统一部署在自己的服务器上,客户可以根据工作实际需求,像软件供应商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得Saas平台供应商提供的服务。

    SaaS产品的特点是按服务内容、时间长短收费。同时,SaaS产品具有多重租赁和可扩展性的特点,同一套软件部署在云服务器上可同时出售给多个用户,而且软件的功能也易于扩展,能够灵活迭代。

    结语

    B端产品功能流程梳理
    总的来说,B端产品更加深奥庞大,因为商业领域的广阔、业务模式的复杂导致B端产品不可能简单,B端的产品经理往往需要在一个行业里深耕2-3年才能对行业有初步认识,想要成为大神需要更长时间的积累和沉淀。

    展开全文
  • ToB和ToC产品分别指什么

    千次阅读 2020-06-19 19:22:45
    C产品也叫2C(to Customer)产品,是面向终端用户或消费者的产品,往往承担引流和转化的任务;C产品是企业与消费者之间的重要媒介,也是企业重要的获客手段之一。 C的产品一般有如下特点: 用户即个体。用户...

    ToB和ToC端产品分别指什么

    什么是C端产品

    C端产品也叫2C(to Customer)产品,是面向终端用户或消费者的产品,往往承担引流和转化的任务;C端产品是企业与消费者之间的重要媒介,也是企业重要的获客手段之一。

    C端的产品一般有如下特点:

    用户即个体。用户就是独立的个人,而不是一个组织或机构;

    强调用户体验。因为C端产品的重要任务是引流和转化,在产品初期,优秀的用户体验会在用户群中形成口碑营销,方便获客。所以C端产品在产品设计上对细节处理有比较高的要求,强调情感化设计。

    运营占据至关重要的位置。对于C端产品来说,产品功能固然非常重要,但是如果没有卓越的运营手法,很可能会走向失败。运营的工作包括了内容建设、营销推广、用户关怀等,如果一个不错的产品加上优秀的运营,那就很可能成功。

    数据驱动设计。C端产品对用户转化率看得极其重要,在转化路径上增加监控,对于每一个按钮,输入框或者配色对进行极致的优化,追求更高的转化率。

    C端产品按照运行设备分为:

    PC端产品:包括Web网站,PC软件。

    移动端产品:包括手机、移动设备上的原生APP和H5应用。

    其他设备端产品:比如嵌入式软件,智能硬件等。

    C端产品按照所实现的功能可分为:

    工具类产品:为用户解决某个具体需求。

    内容类产品:为原创或聚合内容提供分享平台。

    社交类产品:为用户解决沟通交友需求。

    平台类产品:作为双边市场平台服务方,帮助买卖双发实现交易撮合。

    互联网的出现,对传统企业的最大贡献之一就是增加了销售渠道和获客来源。通过在C端产品聚集大量用户,然后加以商业推广,进而达成交易,大大减少传统企业的地推成本和销售人力。所以,C端产品更注重转化率,C端的产品经理就要“变着法子哄用户”,促使用户转化消费,这也要求C端产品经理要非常了解目标用户的需求和消费心理。

    什么是B端产品

    B端产品也叫“2B(Bussiness)”产品,使用对象是组织或企业。B端产品往往是基于某个业务领域,解决客户在办公或经营过程中遇到的问题,为客户提高效率、增加收入、减少成本,一句话概括就是“为客户赚的更多,省的更多”。

    image

    B端产品的目标

    B端的产品一般有如下特点:

    目标用户是群体。B端用户通常是企业或者组织,B端产品里面的功能涉及到多个角色参与,需要多人协作完成。

    效能第一、体验第二。不同于C端产品,B端产品往往注重效率,重视功能的可用性,产品是否能够解决他们的问题是最重要的,体验在效率面前就显得没那么重要了,只是个加分项。

    强调抽象和逻辑。B端产品可能包含一整个业务线的运转,人员、分工、协作、流程和规则随时都可能发生变化,这就需要B端产品经理需要较强的逻辑能力和抽象能力,如何把客户的问题,抽象成一个行业通用的功能,适用于大部分同行的业务操作流程,是B端产品经理经理遇到的问题。

    产品的优劣难以量化。比如,一款跨境电商卖家工具,帮助管理广告投放。广告投放的最重要指标是转化,影响转化的因素很多,广告关键词、产品品质、季节、政策等,即使这款工具能帮你找出很好的广告关键词,但是由于其他因素的影响,你的广告转化率可能仍然很差。

    其实,在商品销售过程中,有很多因素会影响产品销量,B端产品只能承担一部分优化的工作,并不是百分百的担保。商业不是冷冰冰的机器和规则,市场时刻在变,产品需要不断的调整自己以适应市场。

    image

    B端与C端产品功能的区别

    B端产品的部署方式分为:

    私有化部署:就是说软件服务公司上门安装,把他们的软件安装在客户公司特定的主机上运行。这种安装特点是比较安全、网速快;缺点是:软件维护困难,成本较大。

    云部署:指把软件部署在云服务器,客户通过公共Web软件体验服务。这种安装特点是方便、简洁、容易维护、成本较低。缺点是:安全性较低,可能出现网络堵塞。

    B端产品的技术架构可分为:

    B/S架构:即Browser/Server,浏览器/服务器模式,用户通过自己电脑上的浏览器访问系统体验服务。目前市面上大部分B端产品都是这种架构方式。

    C/S架构:即Customer/Server,客户端/服务器模式,这是早起PC软件经常使用的架构方式,用户需要安装客户端才能体验服务,客户端还要经常更新,非常繁琐。

    B端产品按业务方向可分为:

    业务支撑类产品:支持企业经营管理或核心业务的开支,比如仓配系统和CRM。

    办公协同产品:支持企业内部办公协同,比如OA系统、HRM系统。

    image

    OA系统常见功能

    image

    CRM系统常见功能

    有些同学会有疑问:那SaaS产品又是啥?

    SaaS产品

    SaaS是Software-as-a-Service的缩写名称,意思为软件即服务,即通过网络提供软件服务。

    SaaS平台供应商将应用软件统一部署在自己的服务器上,客户可以根据工作实际需求,想软件供应商定购所需的应用软件服务,按定购的服务多少时间长短向厂商支付费用,并通过互联网获得Saas平台供应商提供的服务。

    SaaS产品的特点是按服务内容、市场长短收费。同时,SaaS产品具有多重租赁和可扩展性的特点,同一套软件部署在云服务器上可同时出售给多个用户,而且软件的功能也易于扩展,能够灵活迭代。

    结语

    iamge

    B端产品功能流程梳理

    总的来说,B端产品更加深奥庞大,因为商业领域的广阔、业务模式的复杂导致B端产品不可能简单,B端的产品经理往往需要在一个行业里深耕2-3年才能对行业有初步认识,想要成为大神需要更长时间的积累和沉淀。

    展开全文
  • 供应链金融是一种主要涉及企业、不涉及消费端的金融服务,不对个体消费者开放,它可以为上游供应商和下游分销商融资,其特点之一是核心企业是不可或缺。 此外,供应链融资在设计过程是以实际贸易背景为基础...
  • 供应链金融是一种主要涉及企业、不涉及消费端的金融服务,不对个体消费者开放,它可以为上游供应商和下游分销商融资,其特点之一是核心企业是不可或缺。 此外,供应链融资在设计过程是以实际贸易背景为基础...
  • rabbitmq四种模式

    2020-04-10 22:19:27
    rabbitmq四种模式 一、Work queues 二、Publish(汉译英–帕布雷斯)/...多个消费端消费同一个队列中的消息,队列采用轮询方式将消息是平均发送给消费者特点: 1、一条消息只会被一个消费端接收; 2、...
  • 最近学习RabbitMQ使用方式,记录下来,方便以后使用,也方便和大家共享,相互交流。 RabbitMQ六种工作模式: ...多个消费端消费同一个队列中的消息,队列采用轮询方式将消息是平均发送给消费者特点...
  • 2、创建两个服务端数据生产者和数据消费者 各自创建job(定时任务或实时任务)。 1)数据生产负责向有序队列存放需要处理数据。 2)数据消费从有序队里取数据完成处理操作。 3、优点:适合集群或分布式...
  • 都有添加(生产者使用)、获取(消费者端使用)功能 基本上使用场景都是在多线程、高并发场景 在jdk中的队列有如下几种: 1、LinkedBlockingQueue LinkedBlockingQueue是使用比较多队列,在SingleTh...
  • Kafka简介

    2020-07-19 19:12:02
    点对点模式通常是基于拉取或者轮询的消息传送模型,这个模型的特点是发送到队列的消息被一个且只有一个消费者进行处理,一旦消费者读取队列的消息,它就从该队列消失。生产者将消息放入消息队列后,由消费者主动...
  • 消息中间件ActiveMQ

    2019-07-19 00:27:46
    消费者可以随时取消息 发送不需要知道接收是否正在监听,如果没有接收则会暂时保存在ActiveMQ服务器 发布订阅模式 特点 客户端包括发布者和订阅者 一个消息可以同时被多个订阅者消费 订...
  • RabbitMQ是一个开源AMQP实现,服务器用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等...1、简单模式:一个生产者,一个消费者 2、work模式:一个生...
  • 文章目录发布订阅消息传递域,目的地被称为...(1)生产者将消息发布到 topic ,每个消息可以有多个消费者,属于 1:N 关系 (2)生产者和消费者之间有时间上相关性,订阅某一个主题的消费者只能消费 自它订...
  • 手持终端和手机类似,同样具备操作系统、CPU、电池等特点,但手持终端主要面向企业的工业生产场景,而手机更多是消费者的个人功能场景。手持终端的定义与分类手持终端因其具备数据实时采集、自动存储、即时显示/...
  • 1.Stream分区是当消息提供者发送了相同消息时候,如果被集群的中的某个节点消费了那么如果提供者在此发送相同消息时候 ,一致会被同一个的消费者消费掉 分区配置 提供者需要配置信息 spring....
  • Python核心编程第二版(中文)

    热门讨论 2015-04-23 16:40:13
    12.5.4 被导入到导入作用域名字 12.5.5 关于__future__ 12.5.6 警告框架 12.5.7 从ZIP文件导入模块 12.5.8 “新”导入钩子 12.6 模块内建函数 12.6.1 __import__() 12.6.2 globals()和locals...
  • 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型: 1、点对点(point-to-point,简称PTP)...在这种模型下,消息生产者知道消息消费者的队列并直接将消息发送到消息消费者的队列。这种模型的特点为: ...
  • JAVA面试题 - ActiveMQ

    2020-08-18 17:10:12
    JAVA面试题 总目录篇 目录 queue 与 topic 区别?ActiveMQ如何调优?...在这种模型下,消息生产者知道消息消费者的队列并直接将消息发送到消息消费者的队列。这种模型的特点为:能够保证数据安全; 2、发布/订阅
  • Python核心编程(中文第二版)

    热门讨论 2009-10-02 12:08:14
     7.6.4 如何删除集合中的成员和集合   7.7 集合类型操作符   7.7.1 标准类型操作符(所有集合类型)   7.7.2 集合类型操作符(所有集合类型)   7.7.3 集合类型操作符(仅适用于可变集合)   ...
  • 文章目录前言1.kafka的架构2.kafka的特点或者作用3.kafka中消费者组是怎么回事?消费者组可不可以订阅多个分区?为什么有消费者组,作用是啥?4.sparkstreaming直连kafka的两种方式(这题面试都问烂了)5.怎么维护...
  • Dubbo调优 -- 限流策略

    2019-10-10 09:35:00
    一:前情导读 高并发环境下若生产者不能及时处理请求造成大量请求线程积压,最终会演变为大面积服务崩溃现象产生...一个只能在生产者即dubbo:service亦或是其子标签dubbo:method配置属性,消费者中配置不会生效...
  • 工作队列模式是多个消费共同消费一个工作队列中的消息。结构如下: 其特点是: 多个消费者共同监听一个队列; 消息不能被重复消费; 采用轮询方式将消息平均发送给消费者。 代码实例同:...
  • 订阅-路由模型图特点:在路由模式(Direct),可以实现不同消息被不同队列消费,交换机不再将消息发送给所有绑定队列,而是根据Routing Key将消息发送到指定队列,队列在与交换机绑定时会设定一个Routing ...
  • 笔记:队列

    2020-11-11 16:26:48
    队列:队列其实比较简单,其遵守先进先出规则。...所以,因此,其能够很好用于中间消息件,能够有效防止队列满时候导致生产者线程异常以及当队列是空时候导致消费者队列异常。 ...
  • 多人畅聊系统

    2019-03-14 11:19:19
    背景: 如今,随着互联网时代崛起,通信成为了我们生活不可或缺一部分,社交软件层出不穷,功能也非常繁多,作为一个技术菜鸟,想了解其背后所... 服务器利用生产者与消费者模型对数据进行收发。 利...
  • 工厂模式

    2012-10-12 18:01:48
    简单工厂模式、工厂方法模式、抽象工厂模式都...简单工厂模式最大优点在于工厂类包含了必要逻辑判断,根据客服端的选择条件动态实例化相关类,对于客户端来说,去除了与具体产品依赖。 结构图: 2...
  • 网上书店系统源码

    热门讨论 2012-02-23 19:24:14
    电子商务重新定义了传统的流通模式,减少了中间环节,使得生产者和消费者的直接交易成为可 能,从而在一定程度上改变了整个社会经济运行的方式。 电子商务一方面破除了时空的壁垒,另一方面又提供了丰富的信息资源...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

中端消费者的特点